java - 尝试将原始PCM写入WAV并且仅获取 header

标签 java audio encoding wav pcm

我目前正在使用此代码:

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返回一个空数组。这导致0作为AudioInputStream构造函数长度的参数传递。

new AudioInputStream(
    new ByteArrayInputStream( IOUtils.toByteArray(pcmInputStream) ),
    new AudioFormat(48000,16,2,true,true),
    ( IOUtils.toByteArray(pcmInputStream) ).length/4
)

您应该将字节数组保存到一个临时变量中,而不要尝试在同一输入流上两次调用toByteArray

关于java - 尝试将原始PCM写入WAV并且仅获取 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51618994/

相关文章:

java - Android Studio 上的 java.lang.ExceptionInInitializerError 和 java.lang.IllegalArgumentException 是什么?

java - java程序的运行长度编码

mysql - MySQL 的 Django 编码问题

python - 相互播放音乐和音效 (PyGame)

swift - 从字符串数组快速播放声音

objective-c - .mp3和.wav文件可在模拟器上使用,但不能在设备上使用

android - 如何像下面的结果一样在 android 中编码 url?

java - 多个 cron 表达式触发 jenkins 构建

java - 读取 UTF-8 格式的 CSV 文件

java - Quartz : Based on configured schedule, 给定的触发器永远不会触发