【发布时间】:2011-08-23 14:22:45
【问题描述】:
我们当前的项目要求我们将音频文件发送到服务器,然后使用该音频文件进行进一步的计算。
使用 Java sound api,我能够捕获录音并将其保存为我的系统中的 wav 文件。然后为了将音频 wav 传递给服务器,我使用 Apache Commons HttpClient 向服务器发布请求。 (我正在使用 apache 提供的 InputstreamEntity 并将数据作为一个块发送)。
当我尝试在服务器上重新创建/检索 wav 文件时出现问题。我知道我必须使用 AudioSystem.write API 来创建 wav 文件(就像在我的系统上所做的那样)。但是我观察到的是,虽然文件已创建,但它无法播放(我正在使用 vlc 媒体播放器对其进行测试,仅供参考)。我在 Google 中搜索了示例代码并尝试实现它,但是一旦创建文件就无法播放它。
示例代码 sn-ps 表示我尝试过的方法:
//******************************************************************
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 属性全部为空。这些空值是否存在问题?因此,在服务器上创建波形文件时,我再次尝试手动设置属性。但即使那样 wav 文件也不会播放。
我也尝试了很多本网站上已经提到的方法,但不知何故它们不起作用。我确定我遗漏了一些东西,但我无法确定确切的问题。
如果你们能指出如何从 ServletInputStream 转换为获取 wav,那将非常有帮助。
P.S (1) 我知道代码很破旧,因为我已经经历了一段时间的反复试验。但如果需要,我将提供有关这些方法的更多详细信息。 2)为笨拙道歉,这恰好是我的第一篇文章..)
【问题讨论】: