连接没有间隙的Mp3文件

时间:2014-11-12 18:21:34

标签: java android concatenation

我已成功合并了2个mp3文件。不幸的是,这些文件之间的间隙非常小但明显不同,因此很明显它们是2个独立的文件。

我应该提一下,我亲自从Cubase导出所有这些音频文件的长度,比特率等完全相同。

我在线查看过,但我找不到太多关于此的信息。

我的问题是:

有没有办法在文件末尾切断少量数据或交叉淡化文件?

我觉得这样,即使交叉渐行也可能会有差距。

感谢您的帮助!

这是我的代码:

public  void myMethod1() throws IOException
{
    File newFile=new File(Environment.getExternalStorageDirectory()
            +File.separator
            +"Music"
            +File.separator
            +"MyApp"+File.separator+"MergedFile.mp3"); 

    File newFile1=new File(Environment.getExternalStorageDirectory()
            +File.separator
            +"Music"
            +File.separator
            +"MyApp"+File.separator+"file104.mp3"); 

    File newFile2=new File(Environment.getExternalStorageDirectory()
            +File.separator
            +"Music"
            +File.separator
            +"MyApp"+File.separator+"file105.mp3");

    Log.d("newFile", newFile.toString());
    Log.d("newFile1", newFile1.toString());
    Log.d("newFile2", newFile2.toString());

    FileInputStream fistream1 = new FileInputStream(newFile1 );  // first source file
    FileInputStream fistream2= new FileInputStream(newFile2 );//second source file
    Vector<FileInputStream> v = new Vector<FileInputStream>();
    v.add(fistream1);
    v.add(fistream2);
    SequenceInputStream sistream = new SequenceInputStream(fistream1, fistream2);

    if(!newFile.exists()){
        newFile.createNewFile();
        FileOutputStream fostream=new FileOutputStream(newFile, true);
        int temp;

        while( ( temp = sistream.read() ) != -1)
        {
            //System.out.print( (char) temp ); // to print at DOS prompt
            fostream.write((byte)temp);   // to write to file
        }

        fostream.close();
        sistream.close();
        fistream1.close();
        fistream2.close();

        MediaScannerConnection.scanFile(this,
                new String[] { newFile.toString() }, null,
                new MediaScannerConnection.OnScanCompletedListener() {
            public void onScanCompleted(String path, Uri uri) {
                Log.i("ExternalStorage", "Scanned " + path + ":");
                Log.i("ExternalStorage", "-> uri=" + uri);
            }
        });
    }
}

1 个答案:

答案 0 :(得分:0)

使用MP3设计无法播放 。其原因在于MP3文件格式/解码链的工作原理。

MP3解码由一条管道组成,该管道在将第一帧馈入解码管道和实际输出第一个非零样本之间有一点延迟。

虽然你可以很容易地将两个相同参数的MP3连接在一起,但这通常不能实现完美的无间隙播放,因为它可以说两个WAV文件。为了确保实际输出整个声音,编码器将添加一些(不知道确切的数量,可能随输入长度和频率而变化)填充帧在流的最末端基本上包含静音(从不输出,如果正常播放,他们只是真实数据推送到输出阶段)。

如果想要创建可以动态组合的块(例如用于游戏音乐),则可以使用定义的重叠量并在每个块的开始/结束处丢弃一定量的样本以实现无缝播放。虽然一些音频播放器可能会使用自定义播放列表标签来暗示该过程,但这一般不会起作用。

另请参阅维基百科了解更多基础知识http://en.wikipedia.org/wiki/Gapless_playback#Playback_latency