ffmpeg wird extrem langsam, wenn Sie anstelle von -r die Dauer verwenden

664
Max M.

Was mache ich:

Ich arbeite noch an meinem Diashow-Skript. Das heißt, ich benutze ffmpegs concat demuxer (files.txt), um ffmpeg mit einer Reihe von .jpgDateien für eine Diashow zu versehen.

In der Vergangenheit wollte ich, dass alle Bilder jeweils für 3 Sekunden angezeigt werden. Daher habe ich die Framerate-Flagge -r 1/3von ffmpeg verwendet, um die Dauer zu erreichen, die perfekt und sehr schnell funktioniert hat (etwa 10 Sekunden für alle 600 Bilder).

Was ich jetzt machen möchte:

Jetzt wollte ich, dass die Diashow dynamischer wird, indem die Dauer variiert wird (länger für interessantere usw.). Also entschied ich mich, die Framerate-Flagge duration 3aufzuheben und das Recht in der Concat-Datei festzulegen. Natürlich für jede Datei mit der richtigen Anzahl von Sekunden. Was funktioniert - irgendwie.

Mein einziges Problem ist: Jetzt dauert es ewig, bis ffmpeg das Skript durchläuft. Nicht nur ein bisschen, aber es dauert ungefähr 30 Mal so lange. Obwohl ich schon benutze -c:v libx264 -preset ultrafast.

Es ist also nicht mehr wirklich praktisch zu benutzen. Vermisse ich etwas oder gibt es eine dritte Methode?

Bearbeiten:

Gerade bemerkt ffmpeg fällt diese Warnung: More than 1000 frames duplicated. Dies kann nicht der Fall sein, wenn ein statisches Bild für maximal 5 Sekunden bei 25 Bildern pro Sekunde (Standardwert) angezeigt wird.

Mit freundlichen Grüßen!

0
Versuchen Sie es mit weniger Bildern und überprüfen Sie die Framerate des resultierenden Videos. Es kann zu hoch sein. Daniel B vor 6 Jahren 0
Was ist die kleinste Dauer, die Sie verwenden? Gyan vor 6 Jahren 0
@DanielB Ich habe es nur mit etwa 30 Dateien getestet und das hat ungefähr 20 Sekunden gedauert. Also habe ich noch nicht alle 600 Dateien an ffmpeg geworfen. Max M. vor 6 Jahren 0
@Gyan Mindestens 2 Sekunden, maximal 5 Sekunden. Keine Dezimalzahl oder <1 Sekunde. Max M. vor 6 Jahren 0
25 Bilder pro Sekunde sind 75 mal 0,33 Bilder pro Sekunde. Die Warnung ist also weder ungerechtfertigt noch überraschend. Versuchen Sie es mit 1 fps. Daniel B vor 6 Jahren 0

1 Antwort auf die Frage

0
Gyan

Wenn Sie die durationDirektive in einer Concat-Demuxer-Datei verwenden, legen Sie den Zeitstempel-Offset fest, der auf die nächste Datei angewendet wird, relativ zum Startzeitstempel, der für die aktuelle Datei berechnet wurde. Damit dies funktioniert, können Eingaben -rnicht verwendet werden. Dies bedeutet wiederum, dass jedem Bild die Standard-Framerate von 25 Bildern pro Sekunde zugewiesen wird. Zu diesem Zeitpunkt kann dies nicht geändert werden. Sie können jedoch die Bildfrequenz reduzieren. Da Sie keine Sekundenbruchteile haben, können Sie auf 1 fps reduzieren.

ffmpeg -f concat -i list.txt -vf fps=1 out.mp4 

Ich habe keine Codierungsoptionen ausgelassen. Verwenden Sie ffmpeg 4.0 oder höher.