Java - 组合 2 个以上 .wav 文件时出现问题

标签 java audio stream wave wav

对于我正在开发的项目,我希望能够连接多个 .wav 文件。

通过我的研究,我得出了这段代码:

File sample1 = new File("F:\\Programming\\Resources\\Java_Sound\\trumpet1.wav");
File sample2 = new File("F:\\Programming\\Resources\\Java_Sound\\trumpet2.wav");

File fileOut = new File("F:\\Programming\\Resources\\Java_Sound\\Test.wav");

AudioInputStream audio1 = AudioSystem.getAudioInputStream(sample1);
AudioInputStream audio2 = AudioSystem.getAudioInputStream(sample2);

AudioInputStream audioBuild = new AudioInputStream(new SequenceInputStream(audio1, audio2), audio1.getFormat(), audio1.getFrameLength() + audio2.getFrameLength());

//for(int i = 0; i < 5; i++){
//    audioBuild = new AudioInputStream(new SequenceInputStream(audioBuild, audio2), audioBuild.getFormat(), audioBuild.getFrameLength() + audio2.getFrameLength());
//}

AudioSystem.write(audioBuild, AudioFileFormat.Type.WAVE, fileOut);

它可以很好地组合两个 .wav 文件,但是当我取消注释 for 循环时,生成的 .wav 文件仅播放第一个串联的音频。音轨似乎提前结束,因为 wmp 的持续时间条仅在屏幕上移动了大约 1\5。

我假设问题出在创建的 .wav 文件中的 header 。我研究了许多不同的网页,讨论如何构建 header ,但它们的定义都略有不同,但都说 header 应该是十六进制的。当转换流(不是音频流,标准 FileInputStream)时,我的 header 是十进制的。另外,在 RIFF 部分之后、WAVE 部分之前,应该是整个文件的大小,不包括前 8 个字节。然而我的一些包含连字符。老实说我不知道​​这些是什么意思。然而忽略它们,取消上面代码的注释后测试文件的大小仍然是一个更大的数字。

因此,在研究了如何连接多个音频文件以及如何创建\管理 .wav header 之后,我仍然不知道为什么我的其余音频没有播放(如果它存在的话)。任何帮助是极大的赞赏。提前致谢。

最佳答案

这可能是因为输入流不能被多次读取。一旦您读取输入流,它将位于其末尾,并且尝试进一步读取将不会从该流中读取更多字节。

这应该只需稍加修改即可工作,继续在循环中创建新的音频输入流:

File sample1 = new File("f1.wav");
File sample2 = new File("f2.wav");

File fileOut = new File("combined.wav");

AudioInputStream audio1 = AudioSystem.getAudioInputStream(sample1);
AudioInputStream audio2 = AudioSystem.getAudioInputStream(sample2);

AudioInputStream audioBuild = new AudioInputStream(new SequenceInputStream(audio1, audio2), audio1.getFormat(), audio1.getFrameLength() + audio2.getFrameLength());

for(int i = 0; i < 5; i++)
{
    audioBuild = new AudioInputStream(new SequenceInputStream(audioBuild, /* keep creating new input streams */ AudioSystem.getAudioInputStream(sample2)), audioBuild.getFormat(), audioBuild.getFrameLength() + audio2.getFrameLength());
}

AudioSystem.write(audioBuild, AudioFileFormat.Type.WAVE, fileOut);

此外,请确保文件的音频格式完全相同。也就是说,相同的采样率、相同的 channel 数、每个样本的相同位数。否则,您将需要额外的代码来进行示例转换。

关于Java - 组合 2 个以上 .wav 文件时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6381012/

相关文章:

java - 如何访问私有(private)方法内部的对象?

java - int[] table = new int[10],x;是有效语法吗?

c# - 如何播放声音文件?

java - Java 中的字节流与字符流

c - LPSTREAM 将整个 Stream 内容读入 unsigned char* 数组

Java流套接字只能发送一次

Java Date 转换为 String 并返回 Date,相等性检查失败

java - Mysql 正在保存从 Java 应用程序输入提供的 1 天前的日期

c# - 是否有漂亮的 kernel32 哔声(板载哔声)?

android - MediaPlayer导致FC错误