如何将WAV文件y附加到现有的WAV文件x,s.t. x + = y?

时间:2019-06-11 17:10:52

标签: java

我正在尝试使用for循环中的try / catch块将WAV文件连续添加在一起。我有一个现有的代码段,可以创建一个结合了两个现有文件的新文件,并且我试图将其转换为可以覆盖现有文件并使用其内容的文件。

但是,到目前为止,这是唯一正在发生的事情。给定一系列大小为 n 的WAV file [] ,最后一个条目( file [n-1] )是唯一存储的放在求和文件 x 上。我希望将数组中的所有文件一起添加到 x 中。

我的基本方法包括两部分:将前两个文件加在一起以初始化 x x = file [0] + file [1] ),然后将所有后续文件到 x x + = file [2] + ... + file [n-1] )。第一部分工作正常;我可以初始化一个新的WAV文件,该文件可以轻松合并前两个文件。循环播放时遇到问题。我似乎无法操纵文件写入以使其在 x 不只是成为 file [n-1] 的地方。

以下是可以获取两个文件并将其添加到新文件中的代码:

try {
      AudioInputStream clip1 = AudioSystem.getAudioInputStream(new File("filepath"));
      AudioInputStream clip2 = AudioSystem.getAudioInputStream(new File("filepath"));

      AudioInputStream appendedFiles = new AudioInputStream(
                          new SequenceInputStream(clip1, clip2),     
                          clip1.getFormat(), 
                          clip1.getFrameLength() + clip2.getFrameLength());

            AudioSystem.write(appendedFiles, AudioFileFormat.Type.WAVE, 
                          new File("newFileFilepath"));
} catch (Exception e) { e.printStackTrace(); }

这是我尝试解决问题下半部分(循环附加)的方式:

// filepaths in the array need to be initialized, these are simply placeholders.
String[] filePathClips = {"filepath1", "filepath2", "filepath3", "filepath4"};


// Subsequent appends to the first and second clips, if necessary.
for (int n = 2; n < filePathClips.length; n++) {
    try {
        String stitchAppend = filePathClips[n];

        // clip1 represents the stored and preexisting, previously combined files.
        AudioInputStream clip1 = AudioSystem.getAudioInputStream(new File("combinedFiles"));
        // clip2 is the upcoming file to be added to clip1. 
        AudioInputStream clip2 = AudioSystem.getAudioInputStream(new File(stitchAppend));

        // appendedFiles is the AudioInputStream of the combined files.
        AudioInputStream appendedFiles = new AudioInputStream(
                       new SequenceInputStream(clip1, clip2),     
                       clip1.getFormat(), 
                       clip1.getFrameLength() + clip2.getFrameLength());

        // This line generates the new file, which should just write over the
        // file of the same name (in this case, "combinedFiles"). 
        AudioSystem.write(appendedFiles, AudioFileFormat.Type.WAVE, 
        new File("combinedFiles"));
    }
    catch (Exception e) { e.printStackTrace(); } 
}

我希望写入的文件是所有文件的总和,但是,结果文件只是在循环中添加的最后一个文件。任何对Java声音库或WAV文件管理有丰富经验的人都可以提供帮助,如果您这样做的话,我将不胜感激!感谢您阅读我的问题,并感谢我已经阅读的无数答案,这些都给了我学位。

1 个答案:

答案 0 :(得分:0)

所以,我想通了,回想起来似乎很明显。基本上,每次覆盖文件都会引起一些问题,正如jakub_d指出的那样。解决此问题的方法是更新AudioInputStream附加文件。结果代码为:

try {
// filepaths in the array need to be initialized, these are simply placeholders.
String[] filePathClips = {"filepath1", "filepath2", "filepath3", "filepath4"};

// The first two clips are combined to created the appendedFiles AIS.
AudioInputStream clip1 = AudioSystem.getAudioInputStream(new File(filePathClips[0]));
AudioInputStream clip2 = AudioSystem.getAudioInputStream(new File(filePathClips[1]));

AudioInputStream appendedFiles = new AudioInputStream(
                   new SequenceInputStream(clip1, clip2),     
                   clip1.getFormat(), 
                   clip1.getFrameLength() + clip2.getFrameLength());

// Subsequent appends to the first and second clips, if necessary.
for (int n = 2; n < filePathClips.length; n++) {
    String stitchAppend = filePathClips[n];

    // clip2 is the upcoming file to be added to appendedFiles. 
    clip2 = AudioSystem.getAudioInputStream(new File(stitchAppend));

    // appendedFiles is the AudioInputStream of the combined files.
    appendedFiles = new AudioInputStream(
                   new SequenceInputStream(appendedFiles, clip2),     
                   appendedFiles.getFormat(), 
                   appendedFiles.getFrameLength() + clip2.getFrameLength());
}
// This line generates the new file.
AudioSystem.write(appendedFiles, AudioFileFormat.Type.WAVE, 
    new File("combinedFilesFilepath"));
} catch (Exception e) { e.printStackTrace(); }