FFMpeg: Lege ein Bild oder GIF für X Sekunden über ein Video, während das Video angehalten bleibt.

FFMpeg: Lege ein Bild oder GIF für X Sekunden über ein Video, während das Video angehalten bleibt.

Meine Anforderung ist folgende:

  1. Das Eingabevideo ist eine MP4-Datei
  2. Das Overlay kann entweder GIF oder PNG sein.

Das Overlay sollte mit einem Zeitstempel über dem Eingabevideo erscheinen. Es sollte 5 Sekunden lang dauern. Wenn es sich um ein GIF handelt, sollte es diese 5 Sekunden lang in einer Schleife abgespielt werden. Während dieser 5 Sekunden, in denen das Overlay erscheint, sollte das Hintergrundvideo (sowohl Audio als auch Video) angehalten und dann fortgesetzt werden, sobald das Overlay verschwindet. Das Overlay kann überall zwischen dem 0. und dem letzten Frame auftreten.

Ich habe versucht, das Bild zu einem Zeitstempel einzufügen, den Frame zu diesem Zeitstempel zu berechnen und dann zu verwenden, loopaber ich stoße auf das eine oder andere Problem, entweder mit Audio oder Video. Ich habe auch versucht, das Video zum Zeitpunkt der Überlagerung in zwei Teile aufzuteilen, es auf einen anzuwenden und sie dann zusammenzuführen.

Ich mache das seit drei Tagen und hoffe, dass mir jemand mit dem Befehl hilft, da ich an diesem Punkt nicht mehr weiterkomme.

Antwort1

Uff, ich habe Stunden gebraucht, um das richtig hinzubekommen. Der Kommentar von @Баяр Гончикжапов und die Antwort aus diesem Thema haben geholfen:https://stackoverflow.com/questions/43414641/repeat-last-frame-in-video-using-ffmpeg

Sie müssen den Tpad-Filter auf den Teil vor der Überlagerung anwenden. Auf diese Weise können Sie das letzte Bild dieses Teils so lange anhalten, wie Sie möchten. Als Nächstes polstern Sie den Ton von Teil 1 auf, um die zusätzliche Zeit zu kompensieren, während das Video angehalten ist und die Überlagerung mit einem Pad-Filter anzeigt.

Anschließend kontaktieren Sie die Videoteile + Audioteile und wenden auf das resultierende Video die Überlagerung an.

Als Beispiel verwende ich einen Teil 1 von 30 Sekunden, dann eine Pause mit Überlagerung von 5 Sekunden und einen Teil 2 von ebenfalls 30 Sekunden.

Für ein PNG-Bild:

ffmpeg -reinit_filter 0 -t 30 -i "input.mkv" -ss 30 -t 30 -i "input.mkv" -t 35 -i apple.png -map_metadata -1 -filter_complex "[0]tpad=stop_mode=clone:stop_duration=5,setpts=PTS-STARTPTS[Part1];[0]aselect='between(t,0,30)',apad=pad_dur=5[Audio1];[1]aselect='between(t,0,30)'[Audio2];[Part1][Audio1][1][Audio2]concat=n=2:v=1:a=1[vid];[vid][2]overlay=x=W-w:y=10:enable='between(t,30,35)'[vid]" -map [vid] -c:v libx264 -c:a aac "output_png.mp4"

Für ein GIF-Bild:

ffmpeg -reinit_filter 0 -t 30 -i "input.mkv" -ss 30 -t 30 -i "input.mkv" -t 35 -stream_loop -1 -i horse.gif -map_metadata -1 -filter_complex "[0]tpad=stop_mode=clone:stop_duration=5,setpts=PTS-STARTPTS[Part1];[0]aselect='between(t,0,30)',apad=pad_dur=5[Audio1];[1]aselect='between(t,0,30)'[Audio2];[Part1][Audio1][1][Audio2]concat=n=2:v=1:a=1[vid];[vid][2]overlay=x=W-w:y=10:enable='between(t,30,35)'[vid]" -map [vid] -c:v libx264 -c:a aac "output_gif.mp4"

verwandte Informationen