2011-08-19 150 views
1

我们目前的项目需要我们发送一个音频文件到服务器,然后使用音频文件进行进一步的计算。从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)道歉的笨拙,这恰好是我的第一篇文章..)

回答

0

这不是你如何复制一个流(方法1)。你有正确的代码只复制此:

int numofbytes = inputStream.available();   
byte[] buffer = new byte[numofbytes]; 
inputStream.read(buffer); 
+0

感谢您的答复球员,但我的问题是,我需要在服务器中使用这些字节流创建一个wav文件。虽然文件被创建,但它不会播放。我想创建wav我不得不使用AudioSystem.write或等效的API。我可以简单地将字节写入文件并用.wav扩展命名。我不认为这会起作用。如果你们可以用伪码帮助我,那将会是gr8的帮助。 –

+0

@ user902423 - 你为什么认为我的回答与你正在努力完成的事情无关?如果您无法正确复制流,则对您无用。 – jtahlborn

0

上面流如果所有服务器需要做的就是数据,并将其写入一个文件,那么你需要使用任何音频API:简单地将数据视为一个字节流。

因此,在任何提及AudioInputStream之前的方法1的部分应该是足够的。

0

虽然所选择的方法可能不是完美的解决方案,但由于时间限制,我采用了一种更简单的方法。使用java.util.zip,我简单地将它压缩并发送到服务器,然后编写一个图层,然后将文件解压缩。然后我删除了zip文件。看起来像一个不成熟的解决方案(bcos最初的挑战是发送音频文件)。现在我承担了压缩文件的开销,但是文件传输会比较快。谢谢你们的帮助。