我们目前的项目需要我们发送一个音频文件到服务器,然后使用音频文件进行进一步的计算。从ServletInputStream获取wav文件
使用Java声音API,我能够捕获记录并将其保存为我的系统中的wav文件。然后,为了将音频wav传递给服务器,我使用Apache Commons HttpClient向服务器发送请求。 (我正在使用由apache提供的InputstreamEntity并将数据作为块发送)。
当我尝试重新创建/检索服务器上的wav文件时,出现问题。据我所知,我将不得不使用AudioSystem.write API来创建wav文件(与我的系统完全一样)。然而,我观察到的是,尽管文件被创建,它不会播放(我使用vlc媒体播放器来测试它的FYI)。我在Google中搜索了示例代码,并试图实现它,但一旦创建文件就无法播放它。
的示例代码段表示我曾尝试的方法:
//******************************************************************
try {
InputStream is = request.getInputStream();
FileOutputStream fs = new FileOutputStream("output123.wav");
byte[] tempbuffer = new byte[4096];
int bytesRead;
while((bytesRead=is.read(tempbuffer))!=-1)
{
fs.write(tempbuffer, 0,bytesRead);
}
is.close();
fs.close();
AudioInputStream inputStream =AudioSystem.getAudioInputStream(newFile("output123.wav"));
int numofbytes = inputStream.available();
byte[] buffer = new byte[numofbytes];
inputStream.read(buffer);
int bytesWritten = AudioSystem.write(inputStream, AudioFileFormat.Type.WAVE,new File("outputtest.wav"));
System.out.println("written"+bytesWritten);
方法2
InputStream is = request.getInputStream();
System.out.println("inputStream obtained : "+is.toString());
ByteArrayInputStream bais = null;
byte[] audioBuffer = IOUtils.toByteArray(is);
System.out.println(" is audioBuffer empty? : length = ? "+audioBuffer.length);
try {
AudioFileFormat ai = AudioSystem.getAudioFileFormat(is);
System.out.println("ai bytelength ? "+ai.getByteLength());
System.out.println("ai frame length = "+ai.getFrameLength());
Set<Map.Entry<String,Object>> audioProperties = ai.getFormat().properties().entrySet();
System.out.println("entry set is empty ? "+audioProperties.isEmpty());
for(Map.Entry me : audioProperties){
System.out.println("key = "+me.getKey());
System.out.println("value ="+me.getValue());}
bais = new ByteArrayInputStream(audioBuffer);
AudioInputStream ais = new AudioInputStream(bais, new AudioFormat(8000,8,2,true,true), 2);
AudioSystem.write(ais, AudioFileFormat.Type.WAVE,new File("testtest.wav"));
//*************************************************************************************
的audioFormat
属性的所有原来是空。这些空值是否给出了这个问题?所以,当在服务器上创建wave文件时,我尝试再次手动设置属性。但即使这样,wav文件也不会播放。
我也尝试了很多方法已经在这个网站上提到,但不知何故,他们不工作。我相信我错过了一些东西,但我无法找到确切的问题。
如果你们可以指出如何进行从ServletInputStream到获取wav的转换,那真的很有帮助。 (1)我知道代码是破旧的,因为我现在已经处于试验和错误的状况很长一段时间了。但如果需要的话,我会详细介绍这些方法。 2)道歉的笨拙,这恰好是我的第一篇文章..)
感谢您的答复球员,但我的问题是,我需要在服务器中使用这些字节流创建一个wav文件。虽然文件被创建,但它不会播放。我想创建wav我不得不使用AudioSystem.write或等效的API。我可以简单地将字节写入文件并用.wav扩展命名。我不认为这会起作用。如果你们可以用伪码帮助我,那将会是gr8的帮助。 –
@ user902423 - 你为什么认为我的回答与你正在努力完成的事情无关?如果您无法正确复制流,则对您无用。 – jtahlborn