首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java -组合超过2个.wav文件的问题

Java -组合超过2个.wav文件的问题
EN

Stack Overflow用户
提问于 2011-06-17 11:24:20
回答 2查看 3.1K关注 0票数 2

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

通过我的研究,我能够想出这样的代码:

代码语言:javascript
复制
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)时,我拥有的报头是十进制的。此外,在RIFF部分之后,在WAVE部分之前,应该是整个文件的大小,不包括前8个字节。然而,我的一些代码包含了连字符。老实说,我不知道这些是什么意思。然而,忽略它们,在取消注释上面的代码之后,测试文件的大小仍然是一个更大的数字。

因此,在研究了如何连接多个音频文件,以及如何创建\管理.wav头文件之后,我仍然不知道为什么我的其余音频不能播放,如果它存在的话。任何帮助都是非常感谢的。提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-17 12:37:26

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

只要稍微修改一下,就可以继续在你的循环中创建新的音频输入流:

代码语言:javascript
复制
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);

此外,请确保文件的音频格式完全相同。即,相同的采样率、相同的信道计数、每个采样相同的比特。否则,您将需要额外的代码来执行示例转换。

票数 4
EN

Stack Overflow用户

发布于 2013-04-02 07:59:17

这是我用来加入任何数量的wave文件。我遍历了wave文件路径的字符串值列表,每次我都将前面得到的AudioInputStream与下一个剪辑连接起来。

代码语言:javascript
复制
List<String> paths;
AudioInputStream clip1 = null;
for (String path : paths)
{
    if(clip1 == null)
    {
        clip1 = AudioSystem.getAudioInputStream(new File(path));
        continue;
    }
    AudioInputStream clip2 = AudioSystem.getAudioInputStream(new File(path));
    AudioInputStream appendedFiles = new AudioInputStream(
            new SequenceInputStream(clip1, clip2),     
            clip1.getFormat(), 
            clip1.getFrameLength() + clip2.getFrameLength());
    clip1 = appendedFiles;
}
AudioSystem.write(clip1, AudioFileFormat.Type.WAVE, new File("exported.wav"));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6381012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档