如何合并Java中的两个MP3文件并在Windows Media Player中播放结果?

时间:2017-10-10 12:21:24

标签: java

在下面的代码中合并了两个mp3文件,但合并的音频文件只在VLC媒体播放器中播放,而不是在Windows Media Player中播放。

import java.io.*;
public class TwoFiles
{
    public static void main(String args[]) throws IOException
    {
        FileInputStream fistream1 = new FileInputStream("C:\\Temp\\1.mp3"); 
        FileInputStream fistream2 = new FileInputStream("C:\\Temp\\2.mp3");//second source file
        SequenceInputStream sistream = new SequenceInputStream(fistream1, fistream2);
        FileOutputStream fostream = new FileOutputStream("C:\\Temp\\final.mp3");
        int temp;
        while( ( temp = sistream.read() ) != -1)
        {
            fostream.write(temp);   // to write to file
        }
        fostream.close();
        sistream.close();
        fistream1.close();
        fistream2.close();
    }
}

2 个答案:

答案 0 :(得分:1)

值得检查输出文件是否为预期长度,以便实际连接这两个文件。然而,许多媒体播放器都不会接受这样的MP3文件 - 各种各样的帧头最终都出现在错误的位置,更不用说ID3标签等了。这是对VLC等玩家的稳健性的致敬。 mplayer,他们实际上可以处理结构很差的MP3文件。

处理这种情况的“正确”方法是流出实际的音频数据,然后根据需要添加标签等。坦率地说,这是一只熊,我发现工作得很好的快速而肮脏的方法是在连接文件上运行mp3valmp3val可以(通常)修复粗加入两个文件所导致的错误,并且可用于许多平台。

答案 1 :(得分:0)

使用Java缩放库将MP3文件转换为WAVE文件然后合并两个WAVE文件然后使用jave-1.0.2.jar将组合的WAVE文件转换为MP3文件。

// Convrert Mp3 To Wavw

Converter myConverter = new Converter();
myConverter.convert("D://1476501067.2281665_0.mp3","D://1476501067.2281665_0.mp3"+".wav");

//合并两个Wave文件

 File sample1 = new File("F://StaticVoice.wav");
                                        File sample2 = new File("F://ChangeVoice");
                                           File fileOut = new File("F://MyTest.wav");//WAVEFiles

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

//将WAVE文件转换为MP3

File source = new File("F://Merge.wav");
                             File target = new File("F://Merge.mp3"); 
                                 AudioAttributes audio = new AudioAttributes();
                                 audio.setCodec("libmp3lame");
                                 audio.setBitRate(new Integer(128000));
                                 audio.setChannels(new Integer(1));
                                 audio.setSamplingRate(new Integer(44100));
                                 EncodingAttributes attrs = new EncodingAttributes();
                                 attrs.setFormat("mp3");
                                 attrs.setAudioAttributes(audio);
                                 Encoder encoder = new Encoder();
                                 encoder.encode(source, target, attrs);