从Java中合并两个WAV文件?

17

在Java 1.6中,最简单的方法是如何连接两个WAV文件?(频率相等,没有花哨的东西。)

(这可能非常简单,但我的Google-fu今天在这个主题上似乎很弱。)


3
我了解什么是Google-fu +1 :) - Gueorgui Obregon
4个回答

38

以下是基本代码:

import java.io.File;
import java.io.IOException;
import java.io.SequenceInputStream;
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;

public class WavAppender {
    public static void main(String[] args) {
        String wavFile1 = "D:\\wav1.wav";
        String wavFile2 = "D:\\wav2.wav";

        try {
            AudioInputStream clip1 = AudioSystem.getAudioInputStream(new File(wavFile1));
            AudioInputStream clip2 = AudioSystem.getAudioInputStream(new File(wavFile2));

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

            AudioSystem.write(appendedFiles, 
                            AudioFileFormat.Type.WAVE, 
                            new File("D:\\wavAppended.wav"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

谢谢!一定有一个简单的方法。 - krosenvold
1
这不再起作用了,因为Android不再支持javax.sound.sampled.*包。还有其他方法吗? - Alex K
20
亲爱的Alex,这个问题是关于Java而不是Android的。 - dharmendra
如果这两个文件的长度不同,那么这种方法就行不通了,你怎么看? - Jalal Sordo
1
每个片段的长度都不应该影响。但是,两个文件必须是相同的格式(单声道/立体声、采样率等)。 - James Van Huis
1
AudioInputStream的问题在于.close()方法不起作用 :) - onluiz

4
WAV头部应该不难解析,如果我正确地阅读了这个头部描述,则可以从第二个WAV中剥离前44个字节,并将字节简单地附加到第一个WAV之后。之后,您当然应更改第一个WAV的一些标题字段,以便它们包含正确的新长度。

1
假设它们具有相同的比特率、采样率和通道数。 - dreamlax
但是我真的必须自己做吗?一定有更简单的解决方案吧? - krosenvold
你可以看一下javax.sound.sampled.AudioFileFormat - 至少它能够读取WAV文件,也许你也可以用它来写WAV文件。 - schnaader

4

我通过这里的“代码示例和应用程序”链接找到了AudioConcat(音频拼接)。


1

然而,您的挑战在于如果两个WAV文件在波形头中的格式不完全相同。

如果两个文件的波形格式不同,则必须找到一种方法将它们转换为匹配的格式。

这可能涉及MP3转码或其他类型的转码(如果其中一个使用MP3编解码器进行编码)。


我想我很幸运不必考虑这个问题。 - krosenvold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接