¿Cómo uso ffmpeg para mezclar un archivo de audio / video con un archivo de audio con un desplazamiento?

2

Tengo dos archivos de medios que quiero combinar usando ffmpeg.

  1. El archivo 1 contiene audio y video y comienza a la hora = 0 seg.
  2. El archivo 2 contiene solo audio, y el inicio de este archivo es a tiempo = 2.5 seg.

¿Cómo uso ffmpeg para combinar estos archivos, con el archivo de audio correctamente compensado?

Esto es lo que he intentado:

ffmpeg -i video_and_audio.webm -itsoffset 2.5 -i audio_only.webm -filter_complex amix out.webm

Esto da como resultado un archivo de audio / video con el que parece tener la longitud correcta, y con el audio de ambos archivos mezclados, pero el audio no se desplaza correctamente del archivo de solo audio. El archivo de solo audio parece comenzar con el tiempo = 0, como si no hubiera ningún argumento de compensación. También probé otros valores después de su compensación, pensando que las unidades podrían no ser realmente segundos. Incluso con un valor de 2500, el archivo de solo audio parece comenzar de inmediato.

La salida de ffmpeg parece ser comúnmente solicitada:

ffmpeg version 2.8.2 Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 4.8 (SUSE Linux)
  configuration: --shlibdir=/usr/lib64 --prefix=/usr --mandir=/usr/share/man --libdir=/usr/lib64 --enable-shared --disable-static --enable-debug --disable-stripping --extra-cflags='-fmessage-length=0 -grecord-gcc-switches -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables -g' --enable-pic --optflags='-fmessage-length=0 -grecord-gcc-switches -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables -g' --enable-gpl --enable-x11grab --enable-version3 --enable-pthreads --datadir=/usr/share/ffmpeg --enable-avfilter --enable-libpulse --enable-libwebp --enable-libvpx --enable-libopus --enable-libmp3lame --enable-libvorbis --enable-libtheora --enable-libspeex --enable-libxvid --enable-libx264 --enable-libx265 --enable-libschroedinger --enable-libgsm --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-postproc --enable-libdc1394 --enable-librtmp --enable-libfreetype --enable-avresample --enable-libtwolame --enable-libvo-aacenc --enable-gnutls --enable-libass --disable-decoder=dca --enable-libdcadec --enable-frei0r --enable-libcelt --enable-libcdio --enable-ladspa
  libavutil      54. 31.100 / 54. 31.100
  libavcodec     56. 60.100 / 56. 60.100
  libavformat    56. 40.101 / 56. 40.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 40.101 /  5. 40.101
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
Input #0, matroska,webm, from 'video_and_audio.webm':
  Metadata:
    encoder         : GStreamer matroskamux version 1.5.91
    creation_time   : 2015-11-23 02:57:26
  Duration: 00:01:20.78, start: 0.000000, bitrate: 323 kb/s
    Stream #0:0(eng): Video: vp8, yuv420p, 480x640, SAR 1:1 DAR 3:4, 1k tbr, 1k tbn, 1k tbc (default)
    Metadata:
      title           : Video
    Stream #0:1(eng): Audio: vorbis, 48000 Hz, stereo, fltp (default)
    Metadata:
      title           : Audio
Input #1, matroska,webm, from 'audio_only.webm':
  Metadata:
    encoder         : GStreamer matroskamux version 1.5.91
    creation_time   : 2015-11-23 02:58:46
  Duration: 00:01:17.11, start: 0.000000, bitrate: 79 kb/s
    Stream #1:0(eng): Audio: vorbis, 48000 Hz, stereo, fltp (default)
    Metadata:
      title           : Audio
[libopus @ 0x16c3320] No bit rate set. Defaulting to 96000 bps.
[libvpx-vp9 @ 0x16bd800] v1.3.0
Output #0, webm, to 'out.webm':
  Metadata:
    encoder         : Lavf56.40.101
    Stream #0:0: Audio: opus (libopus), 48000 Hz, stereo, flt, 96 kb/s (default)
    Metadata:
      encoder         : Lavc56.60.100 libopus
    Stream #0:1(eng): Video: vp9 (libvpx-vp9), yuv420p, 480x640 [SAR 1:1 DAR 3:4], q=-1--1, 200 kb/s, 1k fps, 1k tbn, 1k tbc (default)
    Metadata:
      title           : Video
      encoder         : Lavc56.60.100 libvpx-vp9
Stream mapping:
  Stream #0:1 (vorbis) -> amix:input0 (graph 0)
  Stream #1:0 (vorbis) -> amix:input1 (graph 0)
  amix (graph 0) -> Stream #0:0 (libopus)
  Stream #0:0 -> #0:1 (vp8 (native) -> vp9 (libvpx-vp9))
Press [q] to stop, [?] for help
Input stream #0:0 frame changed from size:480x640 fmt:yuv420p to size:360x480 fmt:yuv420p
[libopus @ 0x16c3320] Queue input is backward in time30.41 bitrate= 265.3kbits/s    
Input stream #0:0 frame changed from size:360x480 fmt:yuv420p to size:240x320 fmt:yuv420p
[libopus @ 0x16c3320] Queue input is backward in time00.28 bitrate= 254.3kbits/s    
frame= 1077 fps=4.9 q=0.0 Lsize=    2433kB time=00:01:20.79 bitrate= 246.7kbits/s    
video:1660kB audio:738kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 1.456821%
mattm
fuente

Respuestas:

3

He utilizado con éxito el adelay filtrar para hacer esto. Aquí está el comando:

ffmpeg \
    -i video_and_audio.webm \
    -i audio_only.webm \
    -c:v copy \
    -filter_complex '[1:a] adelay=2500|2500 [delayed]; [0:a] [delayed] amix [out]' \
    -map 0:v \
    -map '[out]' \
    out.webm

Tenga en cuenta que al utilizar el adelay filtro, el retraso debe especificarse en milisegundos y debe especificarse individualmente para cada canal de audio. En este ejemplo, el audio es estéreo (2 canales), por lo que el retraso se especifica dos veces.

Explicación línea por línea:

  • primer archivo de entrada
  • segundo archivo de entrada
  • Copia el video directamente a la salida sin ningún cambio.
  • filtro complejo que toma el audio de la segunda entrada, lo retrasa y luego lo mezcla con el audio de la primera entrada
  • Selecciona el flujo de video desde el primer archivo a la salida.
  • Selecciona el flujo de audio mixto para la salida.
  • Nombre del archivo de salida

Es posible que no necesites la -map Líneas, pero prefiero usarlas.

Moshe Katz
fuente
Se muestra otra forma de hacerlo - concatenando el silencio al principio - aquí Pero creo que así es más elegante.
Moshe Katz