如何连接具有特定重叠持续时间的多个短音频 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

delay1、delay2 和 delay3 需要是多少?它们的持续时间(以毫秒为单位)分别是1.mp32.mp3和吗3.mp3

检索这些持续时间的最佳方法是什么?例如,文件系统文件属性是否准确?

字母 [b]、[c]、[d] 是任意的吗?频道名称?我需要生成吗?

我应该在哪里指定,例如1.mp3和之间2.mp3、2 和 3 之间以及 3 和 4 之间有 10 毫秒的重叠?

或者我应该从延迟1、延迟2、延迟3中减去10毫秒?

补充:这是我整理的手动蒙太奇的快照,用于解释我试图通过编程实现的目标(假设重叠恒定;这里我尝试了大约 100 毫秒)。请解释上面的 delay1、delay2、delay3 的值应该是多少。

手动蒙太奇的快照

FFmpeg 输出的 MP3 持续时间分别为 550、440、500、960、440 毫秒。

========= 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单声道输入。在您的屏幕截图中,这些是“开始”列值。

标签 pads [a]..等是任意的,并分配给过滤器的输出,以便它们稍后可以在其他过滤器中使用或映射到输出。每个 pad 可以使用一次。它们是字母数字,但避免分配纯整数,因为[2]ffmpeg 使用它们来引用输入文件。

相关内容