【问题标题】:Concatenate Mp3 Files Without Gap无间隙连接 Mp3 文件
【发布时间】:2014-11-12 18:21:33
【问题描述】:

我已成功按顺序组合了 2 个 mp3 文件。不幸的是,这些文件之间有一个很小但很明显的差距,这很明显它们是两个独立的文件。

我应该提一下,我个人从 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);
            }
        });
    }
}

【问题讨论】:

  • 您找到解决方案了吗?

标签: java android concatenation


【解决方案1】:

无缝播放不可能通过 MP3 设计。原因在于 MP3 文件格式/解码链的工作原理。

MP3 解码由一个管道组成,该管道在将第一帧送入解码管道和实际输出第一个非零样本之间存在轻微延迟。

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

如果想法是创建可以即时组合的块(例如用于游戏音乐),您可以使用定义的重叠量并在每个块的开始/结束处丢弃一定数量的样本来实现无缝播放。这通常不会起作用,尽管一些音频播放器可能会使用自定义播放列表标签来提示该过程。

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

【讨论】:

    猜你喜欢
    • 2012-07-20
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多