FFMpeg-Video-Overlay mit verzögertem Audio und Video im Hintergrundvideo

FFMpeg-Video-Overlay mit verzögertem Audio und Video im Hintergrundvideo

Ich versuche, mithilfe mehrerer Videodateien den Eindruck eines Bildes in einem Bildvideo zu erzeugen.

Ich habe mit FFMpeg eine MP4-Datei erstellt. Das Video wird in der Windows-App „Filme & TV“ korrekt angezeigt. In Chrome, Firefox, VLC Media Player oder einer anderen meiner Apps wird es nicht korrekt angezeigt. Ich habe vor, das Video in einem Browser anzuzeigen, daher ist mir die browserübergreifende Unterstützung wichtig.

Das Video wurde erstellt, indem zwei Teile eines Videoanrufs genommen und Folgendes mit FFMpeg gemacht wurde:

  1. Legen Sie das Remote-Video (remote.mp4) in den Hintergrund.
  2. Das Remote-Video sollte das erste Bild des Videos zeigen und bis etwa 2,501 Sekunden angehalten erscheinen. Ich habe dies mithilfe des itoffset erreicht.
  3. Die Wiedergabe des Remote-Audios sollte auch nach 2,501 Sekunden beginnen. Das Einstellen des itoffset schien dies nicht zu bewirken, also habe ich dem filter_complex eine Option „adelay“ hinzugefügt.
  4. Lokales Video (local.mp4) als Overlay in der unteren rechten Ecke platziert.
  5. Die lokale Video- und Audiowiedergabe sollte bei 0 Sekunden beginnen (sofort nach der Wiedergabe des Videos).
  6. Das Hintergrundbild um 90 Grad gedreht (es wurde seitlich aufgenommen).
  7. Fügen Sie dem Remote-Video eine Audioverzögerung hinzu, sodass die Wiedergabe des Audiostreams 2,501 Sekunden nach dem Start beginnt.
  8. Die Audioeingänge zusammenführen.
  9. Verwendeter AAC-Codec (da er beliebt zu sein scheint, bin ich durchaus bereit, zu wechseln, wenn das sinnvoll wäre.)
  10. Verwenden Sie den Videocodec h264, da dieser beliebt zu sein scheint.

Mein FFMpeg-Befehl lautet wie folgt:

ffmpeg -itsoffset 2.501 -i remote.mp4 -i local.mp4 \
     -filter_complex \
     " [1:v]scale=iw/4:-1:flags=lanczos[loc0]; \
     [0:v]transpose=1[rotate1]; \
     [rotate1][loc0]overlay=main_w-overlay_w-10:main_h-overlay_h-10:eof_action=pass[rem0]; \
     [0:a]adelay=2501|2501[0adelay]; \
     [0adelay]apad[0a]; \
     [0a][1:a]amerge=inputs=2[a]" \
     -map "[rem0]" -map "[a]" \
     -ac 2 -vcodec libx264 \
     -ar 44100 -acodec aac \
     completed.mp4

Videoeigenschaften:

  1. abgeschlossen.mp4 (16 Sekunden, 480 x 640)
  2. local.mp4 (16 Sekunden, 640 x 480)
  3. remote.mp4 (14 Sekunden, 640x480, seitlich gedreht)

Wenn ich mir das fertige Video in einem Browser ansehe, wird statt 16 Sekunden eine Dauer von 18 Sekunden angezeigt. Wenn ich ffprobe auf das fertige Video anwende, wird angezeigt: Dauer: 00:00:16.68. Die lokale Audio- und Videowiedergabe dauert in einem Browser ebenfalls 2,501 Sekunden.

Jede Hilfe wäre wunderbar. Ich habe keine Ahnung, warum der Browser es anders darstellt, als ich beabsichtige. Danke!

Antwort1

Mit Zeitstempel-Offsets bewirkt ffmpeg dies über Bearbeitungslisten im Ausgabe-MP4. Es sieht so aus, als würden Browser sie nicht analysieren. Wir brauchen also eine Problemumgehung.

ffmpeg -i remote.mp4 -i local.mp4 \
     -filter_complex \
     " [1:v]scale=iw/4:-1:flags=lanczos[loc0]; \
     [0:v]transpose=1,setpts='if(eq(N,0),PTS,PTS+2.501/TB)',fps=30[rotate1]; \
     [rotate1][loc0]overlay=main_w-overlay_w-10:main_h-overlay_h-10:eof_action=pass[rem0]; \
     [0:a]adelay=2501|2501,apad[0a]; \
     [0a][1:a]amerge=inputs=2[a]" \
     -map "[rem0]" -map "[a]" \
     -ac 2 -vcodec libx264 \
     -ar 44100 -acodec aac \
     completed.mp4

Die setptsZeitstempel aller Frames außer dem ersten werden verschoben. Der fpsFilter füllt diese Lücke dann mit Duplikaten des ersten Frames. Ich habe eine Eingabestreamrate von 30 angenommen.

verwandte Informationen