如何連接多個具有特定重疊持續時間的短音訊 MP3 文件

如何連接多個具有特定重疊持續時間的短音訊 MP3 文件

我的 MP3 檔案往往很短,例如 1 秒,包含單字的音節。我想要重疊(一個的結尾與下一個的開頭合併)。我發現了幾個關於交叉淡入淡出的主題,但我不確定我是否需要它(交叉淡入淡出),即在我們過渡到一個主題時降低一個主題的音量並提高下一個主題的音量。我認為此時只需合併音訊就足夠了。

重疊需要在微秒的量級上。我看到 FFmpeg 在某些選項上有秒的小數。目前我正在將一堆短 MP3 與以下內容連接起來:

    /// <summary>
    /// <para/>20170114
    /// </summary>
    /// <returns></returns>
    public void ConcatMP3s(String InFiles, String OutputFile)
    {
        // http://superuser.com/questions/87040/how-to-stich-mp3s-together-with-ffmpeg
        var _IN_PARAMS = " -f concat ";
        var _IN_FILES = "-safe 0 -i " + DQuote(InFiles);
        var _OUT_PARAMS = " -c copy -y ";  // -y to overwrite the output file
        var _OUT_FILE = DQuote(OutputFile);
        //
        var _FFMPEG_ARGS = _IN_PARAMS + _IN_FILES + _OUT_PARAMS + _OUT_FILE;
        //return _FFMPEG_ARGS;
        //
        RunFFmpeg(_FFMPEG_ARGS);
    }

我想要一個可以同時連接多個文件的命令或技術,但是如果您向我展示如何對兩個文件執行此操作,我可以循環遍歷所有文件。這是一個醜陋但可以接受的答案:)。

@Mulvya,我可以從您的連結中獲取以下 FFmpeg 命令列結構(全部在一個命令行字串中)

ffmpeg -i 1.mp3 -i 2.mp3 -i 3.mp3 -i 4.mp3
   -filter_complex
     "[1]adelay=delay1|delay1[b];
      [2]adelay=delay2|delay2[c];
      [3]adelay=delay3|delay3[d];
      [0][b][c][d]amix=4"
merged.mp3

延遲 1、延遲 2 和延遲 3 需要是什麼?它們分別是1.mp32.mp3和的持續時間(以毫秒為單位)嗎3.mp3

檢索這些持續時間的最佳方法是什麼?例如,檔案系統檔案屬性準確嗎?

字母 [b]、[c]、[d] 是任意的嗎?頻道名稱?我需要生成嗎?

例如,我在哪裡指定1.mp32.mp3、2 和 3、然後 3 和 4 之間重疊 10 毫秒?

還是我應該從delay1、delay2、delay3減去10毫秒?

添加:這是我整理的手動蒙太奇的快照,用於解釋我試圖以編程方式實現的目標(假設恆定的重疊;這裡我嘗試大約 100 毫秒)。請解釋上面的delay1、delay2、delay3 的值應該是什麼。

手動蒙太奇的快照

FFmpeg 輸出的 MP3 持續時間分別為 550、440、500、960、440 ms。

========= FFmpeg 的目前輸出

_VDO\FFmpeg 20160310\bin\FFmpeg -i "S:\_W\ARP_WEB\SRC\SND\A4_23\1\01.mp3" -i "S:\_W\ARP_WEB\SRC\SND\A2\1\22.mp3" -i "S:\_W\ARP_WEB\SRC\SND\A2\3\23.mp3" -i "S:\_W\ARP_WEB\SRC\SND\A3\1\24.mp3" -i "S:\_W\ARP_WEB\SRC\SND\A2\2\03.mp3" -filter_complex "[1]adelay=279[b];[2]adelay=592[c];[3]adelay=916[d];[4]adelay=1712[e]; [0][b][c][d][e]amix=5" -y "S:\_W\ARP\AMSSTUDIO\SRC\DATA\FFMPEG\DEBUG Concat with Overlap\OUT.MP3"

ffmpeg version N-79000-g66edd86 Copyright (c) 2000-2016 the FFmpeg developers built with gcc 5.3.0 (GCC) configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libdcadec --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmfx --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-decklink --enable-zlib libavutil 55. 19.100 / 55. 19.100 libavcodec 57. 28.100 / 57. 28.100 libavformat 57. 28.100 / 57. 28.100 libavdevice 57. 0.101 / 57. 0.101 libavfilter 6. 39.102 / 6. 39.102 libswscale 4. 0.100 / 4. 0.100 libswresample 2. 0.101 / 2. 0.101 libpostproc 54. 0.100 / 54. 0.100 [mp3 @ 0000000000584ba0] Estimating duration from bitrate, this may be inaccurate Input #0, mp3, from 'S:\_W\ARP_WEB\SRC\SND\A4_23\1\01.mp3': Duration: 00:00:00.55, start: 0.000000, bitrate: 320 kb/s Stream #0:0: Audio: mp3, 44100 Hz, mono, s16p, 320 kb/s [mp3 @ 00000000005a2a20] Estimating duration from bitrate, this may be inaccurate Input #1, mp3, from 'S:\_W\ARP_WEB\SRC\SND\A2\1\22.mp3': Duration: 00:00:00.44, start: 0.000000, bitrate: 320 kb/s Stream #1:0: Audio: mp3, 44100 Hz, mono, s16p, 320 kb/s [mp3 @ 000000000058af00] Estimating duration from bitrate, this may be inaccurate Input #2, mp3, from 'S:\_W\ARP_WEB\SRC\SND\A2\3\23.mp3': Duration: 00:00:00.50, start: 0.000000, bitrate: 320 kb/s Stream #2:0: Audio: mp3, 44100 Hz, mono, s16p, 320 kb/s [mp3 @ 000000000058cb80] Estimating duration from bitrate, this may be inaccurate Input #3, mp3, from 'S:\_W\ARP_WEB\SRC\SND\A3\1\24.mp3': Duration: 00:00:00.96, start: 0.000000, bitrate: 127 kb/s Stream #3:0: Audio: mp3, 44100 Hz, mono, s16p, 128 kb/s [mp3 @ 00000000005c5c00] Estimating duration from bitrate, this may be inaccurate Input #4, mp3, from 'S:\_W\ARP_WEB\SRC\SND\A2\2\03.mp3': Duration: 00:00:00.44, start: 0.000000, bitrate: 320 kb/s Stream #4:0: Audio: mp3, 44100 Hz, mono, s16p, 320 kb/s Output #0, mp3, to 'S:\_W\ARP\AMSSTUDIO\SRC\DATA\FFMPEG\DEBUG Concat with Overlap\OUT.MP3': Metadata: TSSE : Lavf57.28.100 Stream #0:0: Audio: mp3 (libmp3lame), 44100 Hz, mono, fltp (default) Metadata: encoder : Lavc57.28.100 libmp3lame Stream mapping: Stream #0:0 (mp3) -> amix:input0 Stream #1:0 (mp3) -> adelay Stream #2:0 (mp3) -> adelay Stream #3:0 (mp3) -> adelay Stream #4:0 (mp3) -> adelay amix -> Stream #0:0 (libmp3lame) Press [q] to stop, [?] for help Error while filtering: Cannot allocate memory size= 5kB time=00:00:00.54 bitrate= 70.2kbits/s speed=42.3x video:0kB audio:4kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 4.938003%

答案1

使用以下形式的命令

ffmpeg -i 1.mp3 -i 2.mp3 -i 3.mp3 -i 4.mp3
   -filter_complex
     "[1]adelay=delay1|delay1[b];
      [2]adelay=delay2|delay2[c];
      [3]adelay=delay3|delay3[d];
      [0][b][c][d]amix=4"
merged.mp3

每個delayN以毫秒為單位是音訊相對於音訊串流開頭的起始偏移量。因此,如果您希望 file2 在最終混音的 14.2 秒處開始,請使用adelay=14200|14200立體聲輸入。您可以用於adelay=14200單聲道輸入。在您的螢幕截圖中,這些是「開始」列值。

標籤墊[a]..等是任意的並分配給過濾器的輸出,以便它們稍後可以在其他過濾器中使用或映射為輸出。每個墊片只能消耗一次。它們是字母數字,但避免分配純整數,[2]因為 ffmpeg 使用它們來引用輸入檔。

相關內容