从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的转换,那将会非常有帮助。

PS(1)我知道代码很简陋,因为我现在一直处于试验和错误状态。 但如果需要的话,我会详细介绍这些方法。 2)道歉的笨拙,这恰好是我的第一篇文章..)


这不是你如何复制流(来自方法1)。 你有正确的代码来复制刚刚超过这个数据流:

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

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

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


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

链接地址: http://www.djcxy.com/p/33851.html

上一篇: Obtaining the wav file from ServletInputStream

下一篇: Learning SDL in C