Probleme beim Schleifen eines Streams mit FFMpeg

Ich versuche, ein Video über ein Bild zu legen. Das Problem, mit dem ich konfrontiert bin, ist, dass die gewünschte Videodauer länger ist als die Dauer meines Eingabevideos.

Um dieses Problem zu lösen, versuche ich, eine Streaming-Schleife zu generieren und die gewünschte Dauer mit dem Parameter "t" fest zu codieren.

Ich verwende den setpts-Filter, um sicherzustellen, dass mein Containerformat (.mp4) vergangene Frames akzeptiert, indem ich ihre Zeitstempel umschreibe:

ffmpeg -loop 1 -i image.jpg -stream_loop -1 -i video.mov  -filter_complex "[1:v]setpts=N/(FRAME_RATE*TB)[1v];[0:v][1v]overlay=x=main_w*0.44:y=main_h*0.33[out]" -map [out] -t 00:00:15  out.mp4

Der Befehl lautet also wie folgt:

  1. Nehmen Sie eine unendliche Eingabe, bei der jeder Frame image.jpg ist
  2. Nehmen Sie eine weitere unendliche Eingabe (video.mov) durch Schleifen (-stream_loop -1)

Jeder Frame durchläuft den Filter:

  • setpts schreibt die Zeitstempel für Quelle 1 (video.mov) neu
  • overlay legt jeden setpts-ed Frame aus video.mov über jeden Frame aus der ursprünglichen Eingabe (image.jpg - 0:v)

Dies sollte fortgesetzt werden, bis eine Datei mit 00:00:15 Sekunden erstellt wird.

Dieser Befehl generiert diese Datei, aber die Datei video.mov wird nicht geloopt, sobald die erste Schleife beendet ist, wird der letzte Frame wiederholt, bis der Ausgabefilm endet.

FYI: Ich habe noch ein paar Tests gemacht:

ffmpeg -stream_loop -1 -i movie.mov -filter_complex "[0:v]setpts=N/(FRAME_RATE*TB)[out]" -map [out] -t 00:00:30 output.mp4

Dies funktioniert gut, es erzeugt einen Film mit einer Dauer von 30 Sekunden, wobei der Eingabefilm geloopt wird, um den Ausgabefilm zu füllen

auf der anderen Seite schwer, wenn ich eine weitere Eingabedatei hinzufüge:

ffmpeg -stream_loop -1 -i movie.mov -loop 1 -i image.jpg -filter_complex "[0:v]setpts=N/(FRAME_RATE*TB)[out]" -map [out] -t 00:00:30 output.mp4

Dadurch wird kein Film mit 30 Sekunden erstellt, obwohl einer der Eingänge nie verwendet wird. ffmpeg erstellt eine Filmdatei mit nur einer Schleife von movie.mov und der gleichen Länge von movie.mov.

Irgendwelche Ratschläge bitte?

Danke sehr!

Ze

Antworten (1)

Versuchen Sie es stattdessen mit dem Filmfilter

ffmpeg -loop 1 -i image.jpg -filter_complex \
        "movie=video.mov:loop=999,setpts=N/(FRAME_RATE*TB)[1v]; \
        [0:v][1v]overlay=x=main_w*0.44:y=main_h*0.33[out]" \
       -map [out] -t 00:00:15  out.mp4
Klappt wunderbar! Irgendeine Idee, warum stream_loop nicht funktioniert?
Ich spekuliere hier, aber der stream_loop-Wert wird in derselben gemeinsam genutzten Variablen wie das Loop-Argument des Image-Demuxers registriert und wird nicht wirklich erfolgreich registriert. Der Filmfilter erstellt seinen eigenen lokalen Kontext. Aber das ist nur eine Vermutung.