对于我正在进行的项目,我希望能够连接多个.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文件中的标题上。我研究了许多不同的网页,讨论了标题是如何构造的,但是它们的定义都稍有不同,但是所有人都说标题应为十六进制。当转换流(不是音频流,不是标准FileInputStream)时,我的 header 是十进制的。此外,RIFF部分之后和WAVE部分之前应假定为整个文件的大小,不包括前8个字节。但是我的一些字符包括连字符。老实说,我不知道这些是什么意思。但是,忽略它们,取消注释上面的代码后,测试文件的大小仍然更大。

因此,在研究了如何连接多个音频文件以及如何创建\ manage .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);

另外,请确保文件的音频格式完全相同。也就是说,相同的采样率,相同的通道数,每个采样相同的位。否则,您将需要其他代码来进行样本转换。

08-05 19:14
查看更多