尝试将原始 PCM 写入 WAV,但只得到 header
Trying to write raw PCM to WAV and only getting header
我目前正在使用此代码:
File wavFile=new File("tmp"+File.separator+"recordings"+File.separator+uuid.toString()+".wav");
try{
FileInputStream pcmInputStream=new FileInputStream(file);
FileOutputStream wavOutputStream=new FileOutputStream(wavFile);
AudioSystem.write(new AudioInputStream(new ByteArrayInputStream(IOUtils.toByteArray(pcmInputStream)),
new AudioFormat(48000,16,2,true,
true),IOUtils.toByteArray(pcmInputStream).length/4),
AudioFileFormat.Type.WAVE,wavOutputStream);
wavOutputStream.flush();
wavOutputStream.close();
pcmInputStream.close();
fileOutputStream.close();
}catch(IOException e){
e.printStackTrace();
}
经过检查,我可以确认PCM有30秒的数据,大约4.7MB。这写入了 .wav 文件,但是它只有 44 个字节并且无法播放,我认为这 44 个字节是 RIFF header 但我不确定如何解决它。我尝试使用 File/ByteArray OutputStreams.
的不同长度和不同组合
创建AudioInputStream
时,你调用了两次IOUtils.toByteArray(pcmInputStream)
,在第二次调用时,输入流已经前进到最后,所以toByteArray
returns一个空数组。这导致 0 作为参数传递给 AudioInputStream
构造函数的长度。
new AudioInputStream(
new ByteArrayInputStream( IOUtils.toByteArray(pcmInputStream) ),
new AudioFormat(48000,16,2,true,true),
( IOUtils.toByteArray(pcmInputStream) ).length/4
)
您应该将字节数组保存到一个临时变量,而不是尝试在同一个输入流上调用 toByteArray
两次。
我目前正在使用此代码:
File wavFile=new File("tmp"+File.separator+"recordings"+File.separator+uuid.toString()+".wav");
try{
FileInputStream pcmInputStream=new FileInputStream(file);
FileOutputStream wavOutputStream=new FileOutputStream(wavFile);
AudioSystem.write(new AudioInputStream(new ByteArrayInputStream(IOUtils.toByteArray(pcmInputStream)),
new AudioFormat(48000,16,2,true,
true),IOUtils.toByteArray(pcmInputStream).length/4),
AudioFileFormat.Type.WAVE,wavOutputStream);
wavOutputStream.flush();
wavOutputStream.close();
pcmInputStream.close();
fileOutputStream.close();
}catch(IOException e){
e.printStackTrace();
}
经过检查,我可以确认PCM有30秒的数据,大约4.7MB。这写入了 .wav 文件,但是它只有 44 个字节并且无法播放,我认为这 44 个字节是 RIFF header 但我不确定如何解决它。我尝试使用 File/ByteArray OutputStreams.
的不同长度和不同组合创建AudioInputStream
时,你调用了两次IOUtils.toByteArray(pcmInputStream)
,在第二次调用时,输入流已经前进到最后,所以toByteArray
returns一个空数组。这导致 0 作为参数传递给 AudioInputStream
构造函数的长度。
new AudioInputStream(
new ByteArrayInputStream( IOUtils.toByteArray(pcmInputStream) ),
new AudioFormat(48000,16,2,true,true),
( IOUtils.toByteArray(pcmInputStream) ).length/4
)
您应该将字节数组保存到一个临时变量,而不是尝试在同一个输入流上调用 toByteArray
两次。