试图将原始 PCM 写入 WAV 并且只获取标题
Posted
技术标签:
【中文标题】试图将原始 PCM 写入 WAV 并且只获取标题【英文标题】:Trying to write raw PCM to WAV and only getting header 【发布时间】:2018-07-31 17:29:40 【问题描述】:我目前正在使用此代码:
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 标头,但不确定如何解决它。我尝试过使用不同的长度和不同的 File/ByteArray OutputStreams 组合。
【问题讨论】:
java pcm to wav的可能重复 【参考方案1】:创建AudioInputStream
时,调用IOUtils.toByteArray(pcmInputStream)
两次,第二次调用时,输入流已经前进到最后,所以toByteArray
返回一个空数组。这导致 0 作为参数传递给 AudioInputStream
构造函数的长度。
new AudioInputStream(
new ByteArrayInputStream( IOUtils.toByteArray(pcmInputStream) ),
new AudioFormat(48000,16,2,true,true),
( IOUtils.toByteArray(pcmInputStream) ).length/4
)
您应该将字节数组保存到一个临时变量中,而不是尝试在同一个输入流上调用toByteArray
两次。
【讨论】:
以上是关于试图将原始 PCM 写入 WAV 并且只获取标题的主要内容,如果未能解决你的问题,请参考以下文章
将 PCM 录制的数据写入 .wav 文件(java android)
写入 PCM 数据时的文件 (.wav) 持续时间 @16KBps