用Java连接mp3文件

时间:2014-01-27 13:00:18

标签: java audio mp3 concatenation xuggler

我遇到串联mp3文件的问题。例如,我有5个mp3文件。我想将它们连接到一个文件。

我试试这个:

try {
    InputStream in = new FileInputStream("C:/a.mp3");
    byte[] buffer = new byte[1024];
    OutputStream os = new FileOutputStream(new File("C:/output.mp3",
            true));
    int count;
    while ((count = in.read(buffer)) != -1) {
        os.write(buffer, 0, count);
        os.flush();
    }
    in.close();
    in = new FileInputStream("C:/b.mp3");// second mp3
    while ((count = in.read(buffer)) != -1) {
        os.write(buffer, 0, count);
        os.flush();
    }
    in.close();
    os.close();
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

但这不起作用。我在这个过程结束时得到一个mp3文件,它包含来自源mp3文件的所有音乐数据,但是在Options中我只看到来自第一个源mp3文件的fihish mp3的时间。而且,当我尝试使用这个最终的mp3文件,当我使用Xuggle库将这个mp3音频添加到mp4视频时,我收到错误。

我确定,来自每个mp3源文件的字节问题,其中记录了元信息。也许存在一些正确连接mp3的库?

2 个答案:

答案 0 :(得分:2)

你的方法有很多问题。

a。)如果源文件中有任何元数据,则复制元数据。在连续文件中,那些元数据(Id3v1和Id3v2)将出现多次,更糟糕的是,在它们不应该存在的位置(Id3v1 必须位于文件的末尾,Id3v2在IIRC开头)。这可能会使解码器混淆将文件识别为损坏(它可能会播放第一部分,然后打击第二部分的意外元数据)。

b。)计算MP3的长度并不是那么简单,需要计算文件中MP3帧的数量。由于没有标题可以告知帧数,因此唯一的安全方法是按顺序扫描文件(如解码)。在引入MP3时,这曾经是一项代价高昂的操作,因此有多种方法可以解决这个问题(VBR标题块和Id3元标记)。如果您的播放器依赖于这些,它将始终检测长度仅为第一部分。

c。)即使您正确剥离元数据,您也只能使用相同的参数(采样率)连接MP3流,有些解码器甚至可能对比特率和类型(单声道/ MS / Istereo等)有额外的限制。 )。

你知道,它可以完成,但它的不是是微不足道的。

答案 1 :(得分:0)

你不能以这种方式追加音乐文件。你需要的是一个外部库(跛脚或......),在java中......几乎是不可能的,JMF已经死了。