我们当前的项目要求我们将音频文件发送到服务器,然后使用音频文件进行进一步计算。
使用Java声音api,我能够捕获录音并将其保存为系统中的wav文件。然后为了将音频wav传递给服务器,我使用Apache Commons HttpClient向服务器发送请求。 (我使用apache提供的InputstreamEntity并将数据作为块发送)。
当我尝试在服务器上重新创建/检索wav文件时出现问题。我知道我必须使用AudioSystem.write API来创建wav文件(就像在我的系统上完成的那样)。然而,我观察到的是,虽然文件被创建,但它没有播放(我正在使用vlc媒体播放器测试它FYI)。我在谷歌搜索过示例代码并试图实现它,但是一旦创建文件就无法播放它。
示例代码段表示我尝试过的方法:
//******************************************************************
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
属性均为null。这些空值是否给出了问题?因此,在服务器上创建wave文件时,我尝试再次手动设置属性。但即使这样,wav文件也无法播放。
我也尝试过这个网站上已经提到过的很多方法,但不知何故它们都没有用。我确信我错过了一些东西,但我无法确切地指出确切的问题。
如果你们可以指出如何从ServletInputStream转换到获取wav,那将会非常有用。
P.S(1)我知道代码很破旧,因为我已经在一段时间内处于试错状态。但如果需要,我会详细介绍这些方法。 2)为笨拙道歉,这恰好是我的第一篇文章..)
答案 0 :(得分:0)
这不是您复制流的方式(来自方法1)。你有正确的代码来复制这个上面的流。:
int numofbytes = inputStream.available();
byte[] buffer = new byte[numofbytes];
inputStream.read(buffer);
答案 1 :(得分:0)
如果您的服务器想要做的就是获取数据并将其写入文件,那么不需要使用任何音频API:只需将数据视为字节流
因此,在提及AudioInputStream
之前,方法1的部分应该足够了。
答案 2 :(得分:0)
虽然选择的方法可能不是完美的解决方案,但由于时间限制,我采用了一种更简单的方法。使用java.util.zip我只需将其压缩并将其发送到服务器,然后在文件解压缩时写入一层。然后我删除了zip文件。似乎是一个不成熟的解决方案(bcos最初的挑战是发送音频文件)。现在我承担了压缩文件的开销,但文件传输会相对更快。谢谢你的帮助。