Como concatenar vários arquivos MP3 curtos de áudio com uma duração de sobreposição específica

1

Eu tenho arquivos MP3 que tendem a ser muito curtos, como 1 segundo, contendo sílabas de palavras. Eu gostaria de ter uma sobreposição (final de um mesclado com o início do próximo). Eu encontrei vários tópicos sobre crossfading, mas não tenho certeza se preciso dele (crossfading), ou seja, diminuir o volume de um e aumentar o volume do próximo, à medida que fazemos a transição para ele. Eu acho que apenas uma fusão do áudio é suficiente no momento.

A sobreposição precisa ser da ordem de microssegundos. Eu vejo FFmpeg tem decimais de alguns segundos em algumas das opções. Atualmente estou concatenando um monte de MP3s curtos com o seguinte:

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

Eu gostaria de um comando ou técnica que irá concatenar vários arquivos de uma só vez, mas se você me mostrar como fazer isso para dois arquivos, eu posso percorrer todos eles. É uma resposta feia mas aceitável:).

@Mulvya, o que eu poderia pegar do seu link é a seguinte estrutura de linha de comando do FFmpeg (tudo em uma cadeia de linha de comando)

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

O que o delay1, delay2 e delay3 precisam ser? Eles são as durações em milissegundos de 1.mp3 , 2.mp3 e 3.mp3 , respectivamente?

Qual é a melhor maneira de recuperar essas durações? por exemplo, as propriedades do arquivo do sistema de arquivos são precisas?

As letras [b], [c], [d] são arbitrárias? nomes de canal? Vou precisar gerar?

Onde especifico, por exemplo, 10 milissegundos se sobrepõem entre 1.mp3 e 2.mp3 , 2 e 3 e, em seguida, 3 e 4?

Ou devo menos 10 milissegundos de delay1, delay2, delay3?

Adição: aqui está um instantâneo de uma montagem manual que eu coloquei em conjunto para explicar o que estou tentando alcançar programaticamente (suponha uma sobreposição constante; aqui estou tentando cerca de 100 ms). Por favor, explique quais valores para delay1, delay2, delay3 acima devem ser.

AsduraçõesdeMP3dasaídadoFFmpegsão550,440,500,960,440ms,respectivamente.

=========SaídaatualdoFFmpeg

_VDO\FFmpeg20160310\bin\FFmpeg-i"S:\_W\ARP_WEB\SRC\SND\A4_23.mp3" -i "S:\_W\ARP_WEB\SRC\SND\A2.mp3" -i "S:\_W\ARP_WEB\SRC\SND\A2.mp3" -i "S:\_W\ARP_WEB\SRC\SND\A3.mp3" -i "S:\_W\ARP_WEB\SRC\SND\A2.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.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.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.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.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.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%

    
por Marie 27.01.2017 / 08:45

1 resposta

0

Use um comando do formulário

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

Cada delayN em milissegundos é o deslocamento inicial de um áudio desde o início do fluxo de áudio. Portanto, se você quiser que o arquivo2 inicie em 14,2 segundos da mixagem final, use adelay=14200|14200 para uma entrada estéreo. Você pode usar adelay=14200 para uma entrada mono. Na captura de tela, esses são os valores da coluna Iniciar.

Os blocos de etiquetas [a] ..etc são arbitrários e atribuídos às saídas de filtros para que possam ser usados posteriormente em outros filtros ou mapeados para saída. Cada bloco pode ser consumido uma vez. Eles são alfanuméricos, mas evitam atribuir inteiros puros como [2] , já que o ffmpeg usa aqueles para se referir aos arquivos de entrada.

    
por 28.01.2017 / 06:46