Ich habe Videoframes im PNG-Format mit 1 FPS und versuche, sie mit ffmpeg in ein Video zu konvertieren.
Wenn ich so etwas mache:
ffmpeg -i data/input-%4d.png data/output.mp4
Ich erhalte ein Video mit 25 Bildern pro Sekunde, was im Grunde genommen ein sehr schneller Vorlauf des Eingangs ist (der mit 1 Bildern pro Sekunde aufgenommen wird).
Wenn ich es versuche:
ffmpeg -i data/input-%4d.png -r 1 data/output.mp4
Ich bekomme etwas, das VLC nicht spielen möchte :)
Wenn ich jetzt das erste Video (das FF-Video) nehme und einen Filter anwende, um es zu verlangsamen (z. B. -filter:v 'setpts=24.0*PTS'
), kann ich es wie ein 1-fps-Video wiedergeben, aber der Preis ist natürlich die Dateigröße. Es generiert eine Reihe von wiederholten Frames, denke ich.
Die Frage ist also, wie erstelle ich ein Video, das genau 1 FPS hat und tatsächlich mit dieser Geschwindigkeit abgespielt wird? Das Ausgabeformat ist übrigens für mich nicht so wichtig.
quelle
ffmpeg
schlau genug bin , den Videocodec nur anhand der Dateierweiterung im Containerformat herauszufinden.mp4
. Versuchen Sie-vcodec libx264 -vpre hq
, der Befehlszeile den Codec und die Codierungsparameter hinzuzufügen .-r 1
.Antworten:
Wenn Sie einen Einzeiler für FFMPEG benötigen, der ein Video mit einer Wiedergabegeschwindigkeit von 1 Frame pro Sekunde generiert, müssen Sie die Frameraten für Eingabe und Ausgabe wie folgt festlegen:
Dies
-r 1
bedeutet, dass das Video mit 1 der Originalbilder pro Sekunde abgespielt wird.Dies
-r 10
bedeutet, dass das Video mit 10 Bildern pro Sekunde abgespielt wird.(Dies
-pix_fmt yuv420p
ist nur erforderlich, um die Kompatibilität mit einer Vielzahl von Wiedergabeprogrammen zu gewährleisten. Dies ist beispielsweise erforderlich, damit das Video von Windows Media Player wiedergegeben werden kann.)Ich habe viele verschiedene Ausgangs-Frameraten getestet, und 10 scheint die niedrigste Zahl zu sein, die Sie verwenden können, um ein Video zu produzieren, das VLC wiedergibt.
Der obige Befehl bedeutet natürlich, dass jedes Originalbild multipliziert wird, aber es ist eine einfachere Methode als die von Ihnen erwähnte "Verlangsamung" und abhängig vom Codec wird möglicherweise kein Video erzeugt, das viel größer als eine echte 1-FPS ist Video.
Um dies zu testen, habe ich gerade ein echtes 1-FPS-Video produziert, das 2,24 kiB groß war. Ich habe dann ein Video mit denselben Eingabebildern, aber einer Ausgabe von 24 FPS, erstellt und es ergab sich ein Wert von 5,76 kiB. Das ist etwas mehr als die doppelte Größe und bei weitem nicht die 24-fache Größe. :)
quelle
Verwenden Sie beide
-framerate
und-r
Zum Beispiel, um ein letztes Video zu haben, das wie 1FPS aussieht:
Dies ähnelt dem Konvertieren von PNG-Frames in Videos mit 1 FPS Unix und Linux - Stack von Exchange sagt, aber ich brauchte ,
-framerate
anstatt-r
für sie zu arbeiten.Dies wird im Wiki unter http://trac.ffmpeg.org/wiki/Slideshow#Framerates erwähnt
Hiermit wird die Ausgabeframerate auf festgelegt
30
, mit der VLC umgehen kann, und jedes Bild wird 30 Mal kopiert, sodass das Ausgabevideo mit 1 FPS angezeigt wird. Siehe auch: Wiedergabeprobleme in VLC mit Videos mit niedriger Bildrate von Bildern mit ffmpeg | PaketüberflussVLC kann das Video dann normal abspielen.
Getestet unter Ubuntu 16.10, VLC 2.2.4,
ffmpeg
3.0.5 in einem Verzeichnis mit 10 PNGs.Siehe auch: /programming/19267443/vlc-freezes-for-low-1-fps-video-created-from-images-with-ffmpeg
quelle
-r
und-framerate
?man
Seiten zu extrahieren , lass es mich wissen ;-) Ein aussagekräftiges Zitat ist "-r als Bei der Eingabeoption werden alle in der Datei gespeicherten Zeitstempel ignoriert und stattdessen Zeitstempel mit einer konstanten Bildrate von fps generiert FFmpeg). Verwenden Sie im Zweifelsfall -framerate anstelle der Eingabeoption -r. "Was ist, wenn Sie Ihr zweites Beispiel wie folgt leicht erweitern:
Das
-r 1
muss vor den .png-Dateien kommen, nicht danach.Aus der FFmpeg-Dokumentation :
quelle
Dies ist ein Fehler in VLC (der in Version 3.0.6 noch vorhanden ist). Nach einigen Experimenten stellte ich fest, dass VLC bei Videos mit FPS von weniger als 10 abstürzt . Daher sollten alle Videos mit 10 FPS oder mehr kein Problem sein. Daher gibt es derzeit keinen sauberen Weg, um ein Video mit 1 FPS zu erhalten, das in VLC wiedergegeben werden kann ( nicht aufgeben, weiterlesen ).
Eine Problemumgehung ist - wie in der obigen Antwort gezeigt - die Fälschung des Effekts von 1 FPS durch Duplizieren der Bilder (wenn wir tatsächlich eine FPS von 10 oder mehr haben, was für VLC in Ordnung ist).
Beispiel: Wenn Sie einen Ordner mit 12 Bildern haben und ein Video mit 1 FPS (das in VLC abgespielt werden kann) erstellen möchten, müssen Sie jedes Bild mehrmals duplizieren (sagen wir mal 10) und dann FFMPEG mitteilen um ein 10 FPS Video zu erzeugen. Auf diese Weise erhalten wir ein Video mit insgesamt 120 Bildern, in dem jedes Bild 1 Sekunde lang abgespielt wird (da es 10 Mal dupliziert wird), was einfach eine Fälschung für 1 FPS ist.
Ich bevorzuge es ,
fps
Parameter-r
zu verwenden , anstatt (was in einer anderen Antwort gezeigt wird), was in einigen Fällen problematisch sein kann (gemäß der offiziellen Dokumentation ).Da die Eingabe
-framerate
niedriger als die Ausgabe istfps
, dupliziert FFMPEG Frames, um die gewünschte Framerate für die Ausgabe zu erreichen (entsprechend dem obigen Befehl 10).Es ist auch wichtig zu beachten, dass die Reihenfolge von
-framerate
und-vf fps
wichtig ist , da diese Konfiguration auf das nächste erwähnte Video (Ein- oder Ausgabe) angewendet wird. Das ist laut den offiziellen Dokumenten :quelle