有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

音频Java无法组合2个以上。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文件。wav文件仅在第一次连接时播放音频。音频曲目似乎提前结束,因为wmp的持续时间条只在屏幕上移动了大约1\5倍

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

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


共 (2) 个答案

  1. # 1 楼答案

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

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

    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);
    

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

  2. # 2 楼答案

    这是我用来连接任意数量的wave文件的。我循环浏览了wave文件路径的字符串值列表,每次我都会将上一个结果AudioInputStream与下一个剪辑连接起来

    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"));