Wie verwende ich ffmpeg, um eine Audio- / Videodatei mit einer Audiodatei mit einem Offset zu mischen?

1454
mattm

Ich habe zwei Mediendateien, die ich mit ffmpeg kombinieren möchte.

  1. Datei 1 enthält Audio und Video und beginnt um 0 Sekunden.
  2. Datei 2 enthält nur Audio und der Beginn dieser Datei ist zum Zeitpunkt = 2,5 Sekunden.

Wie kann ich diese Dateien mit ffmpeg kombinieren, wobei die Audiodatei korrekt versetzt ist?

Das habe ich versucht:

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

Dies führt dazu, dass eine Audio- / Videodatei scheinbar die richtige Länge hat und das Audio aus beiden Dateien gemischt ist, das Audio jedoch nicht richtig von der Nur-Audio-Datei versetzt ist. Die Nur-Audio-Datei scheint Zeit = 0 zu beginnen, als gäbe es kein itsoffset-Argument. Ich habe auch andere Werte nach seinem Versatz ausprobiert und dachte, dass die Einheiten nicht wirklich Sekunden sind. Selbst mit einem Wert von 2500 scheint die reine Audiodatei immer noch sofort zu starten.

Die ffmpeg-Ausgabe scheint häufig angefordert zu werden:

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% 
2

1 Antwort auf die Frage

3
Moshe Katz

Ich habe den adelayFilter erfolgreich dazu verwendet . Hier ist der Befehl:

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 

Beachten Sie, dass bei Verwendung des adelayFilters die Verzögerung in Millisekunden und für jeden Audiokanal einzeln angegeben werden muss. In diesem Beispiel ist das Audio Stereo (2-Kanal), sodass die Verzögerung zweimal angegeben wird.

Zeile für Zeile Erklärung:

  • erste Eingabedatei
  • zweite Eingabedatei
  • Kopieren Sie das Video ohne Änderungen direkt in die Ausgabe
  • Ein komplexer Filter, der den Ton des zweiten Eingangs übernimmt, ihn verzögert und dann mit dem Ton des ersten Eingangs mischt
  • wählt den Videostream aus der ersten auszugebenden Datei
  • wählt den gemischten Audiostream zur Ausgabe aus
  • Name der Ausgabedatei

Sie benötigen die -mapZeilen zwar nicht wirklich, aber ich ziehe es vor, sie zu verwenden.

Ein anderer Weg, dies zu tun, indem Stille am Anfang verkettet wird, wird [hier] (http://stackoverflow.com/a/31957317/829970) gezeigt, aber ich denke, dass dieser Weg eleganter ist. Moshe Katz vor 8 Jahren 0