Ich habe Videobilder 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 bekomme ein Video mit 25 FPS, was im Grunde genommen ein ist Sehr schneller Vorlauf der Eingabe (die mit 1 FPS erfasst wird).

Wenn ich es versuche:

ffmpeg -i data/input-%4d.png -r 1 data/output.mp4

Ich bekomme etwas, das VLC nicht abspielen möchte 🙂

Wenn ich nun 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 abspielen lassen, aber der Preis ist natürlich die Dateigröße. Ich denke, es werden eine Reihe von wiederholten Frames generiert.

Die Frage ist also, wie ich ein Video mit genau 1 FPS erstelle und tatsächlich mit dieser Geschwindigkeit abspiele. Das Ausgabeformat ist übrigens nicht “ Das ist für mich nicht so wichtig.

Kommentare

  • Ich ‚ bin mir nicht sicher ffmpeg ist intelligent genug, um den Videocodec nur anhand der Dateierweiterung im Containerformat .mp4 herauszufinden. Versuchen Sie, -vcodec libx264 -vpre hq zur Befehlszeile hinzuzufügen, um den Codec und die Codierungsparameter mitzuteilen.
  • Es hat tatsächlich herausgefunden, dass es in Ordnung ist, und ich habe, wie erwähnt, gut funktioniert und Nur seltsame Ergebnisse wurden erzielt, als ich -r 1 hinzugefügt habe.
  • Ich denke, Sie haben möglicherweise mehr Glück bei einer ffmpeg-Antwort auf stackoverflow.com oder superuser.com .

Antwort

Wenn Sie einen Einzeiler für FFMPEG benötigen, der ein Video generiert, das mit 1 Bild pro Sekunde abgespielt wird, müssen Sie die Frameraten für Eingabe und Ausgabe wie folgt angeben:

ffmpeg -r 1 -i Daten / Eingabe-% 4d.png -pix_fmt yuv420p -r 10 Daten / Ausgabe.mp4

Die -r 1 bedeutet, dass das Video mit 1 der Originalbilder pro Sekunde abgespielt wird.
Die -r 10 bedeutet, dass das Video mit 10 Bildern pro Sekunde abgespielt wird.

(Die -pix_fmt yuv420p dient nur dazu, die Kompatibilität mit einer Vielzahl von Wiedergabeprogrammen sicherzustellen. Hier ist es beispielsweise erforderlich, dass das Video von Windows Media Player abgespielt werden kann.)

Ich habe viele verschiedene Ausgabe-Frameraten getestet, und 10 scheint die niedrigste Zahl zu sein, die Sie verwenden können, um immer noch eine zu erzeugen Video, das von VLC abgespielt wird.

Natürlich bedeutet der obige Befehl, dass jedes Originalbild multipliziert wird, aber es ist eine einfachere Methode als die von Ihnen erwähnte „Verlangsamung“ und abhängig vom Codec Möglicherweise wird kein Video erstellt, das viel größer als ein echtes 1-FPS-Video ist.

Um dies zu testen, habe ich gerade ein echtes 1-FPS-Video erstellt, das 2,24 kiB betrug. Ich habe dann ein Video mit den gleichen Eingabebildern produziert, aber mit 24 FPS ausgegeben, und es kam auf 5,76 kiB heraus. Das ist etwas mehr als doppelt so groß und bei weitem nicht 24-mal so groß. 🙂

Kommentare

  • +1 auf -pix_fmt. Einfach zu Vergessen Sie, dass einige Leute darauf bestehen, WMP zu verwenden 🙂
  • Warum sollte das Ausgabeformat 10 fps betragen, während die Eingabe nur 1 ist? Würde ‚ dies nicht tun 90% redundante Frames erstellen, die genau gleich sind?
  • @Herbert Es werden redundante Frames erstellt, sodass Sie die Framerate auf 10 erhöhen können. Dies geschieht , nur damit VLC nicht ‚ beschwert sich nicht und ändert visuell ‚ das Video nicht. Der Encoder ist intelligent genug, um zu erkennen, dass alle Frames identisch sind Sie ‚ erhalten am Ende keine viel größere Datei
  • @chiliNUT clear, die Keyframe-Sache, die nicht alle Formate, aber die meisten vernünftigen Formate tun. Danke !

Antwort

Verwenden Sie beide -framerate und -r

Um beispielsweise ein endgültiges Video zu haben, das wie 1FPS aussieht:

ffmpeg -framerate 1 -pattern_type glob -i "*.png" \ -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4 

Dies ähnelt dem, was Konvertieren von PNG-Frames in Video mit 1 FPS | Unix & Linux Stack Exchange sagt, aber ich brauchte -framerate anstelle von -r damit es funktioniert.

Dies wird im Wiki unter folgender Adresse erwähnt: http://trac.ffmpeg.org/wiki/Slideshow#Framerates

Setzt die Ausgabe-Framerate auf 30, die VLC verarbeiten kann, und kopiert jedes Bild 30 Mal, sodass das Ausgabevideo mit 1 FPS angezeigt wird. Siehe auch: Wiedergabeprobleme in VLC mit Videos mit niedriger fps von Bildern mit ffmpeg | Stapelüberlauf

VLC 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: https://stackoverflow.com/questions/19267443/vlc-freezes-for-low-1-fps-video-created-from-images-with-ffmpeg

Kommentare

  • Was ‚ ist der Unterschied zwischen -r und -framerate?
  • @Royi Ich ‚ weiß es nicht wirklich, außer dass es das einzige ist, was für mich funktioniert hat 🙂 Aber wenn du es geschafft hast Extrahieren Sie es aus den man -Seiten, lassen Sie es mich wissen 😉 Ein aussagekräftiges Zitat ist “ -r In der Datei gespeicherte Zeitstempel generieren stattdessen Zeitstempel unter der Annahme einer konstanten Bildrate fps. Dies ist nicht dasselbe wie die Option -framerate, die für einige Eingabeformate wie image2 oder v4l2 verwendet wird (in älteren Versionen von FFmpeg war sie früher dieselbe). Verwenden Sie im Zweifelsfall -framerate anstelle der Eingabeoption -r. “

Antwort

Was ist, wenn Sie Ihr zweites Beispiel wie folgt leicht erweitern:

$ ffmpeg -r 1 -i data/input-%4d.png -c:v libx264 out.mp4 

Die -r 1 muss vor den PNG-Dateien stehen, nicht nach.

Aus der FFmpeg-Dokumentation :

In der Regel werden Optionen auf die nächste angegebene Datei angewendet. Daher ist die Reihenfolge wichtig, und Sie können dieselbe Option mehrmals in der Befehlszeile verwenden. Jedes Vorkommen wird dann auf die nächste Eingabe- oder Ausgabedatei angewendet.

Kommentare

  • Leider funktioniert nicht. Die Erwähnung, dass die Reihenfolge wichtig ist , hat mir jedoch viel Zeit gespart. Vielen Dank.

Antwort

Dies ist ein Fehler in VLC (der in Version 3.0.6 noch vorhanden ist). Nach einigen Experimenten wurde mir klar, dass VLC für Videos mit einer FPS von weniger als 10 abstürzt. Daher sollten alle Videos mit 10 FPS oder mehr kein Problem darstellen. Daher gibt es derzeit keine saubere Möglichkeit, ein Video mit 1 FPS zu erhalten, das in VLC abgespielt werden kann ( nicht Geben Sie auf, lesen Sie weiter ).

Eine Problemumgehung ist – wie in der obigen Antwort gezeigt -, um den Effekt von 1 FPS durch Duplizieren der Bilder vorzutäuschen (wenn Wir haben tatsächlich einen FPS von 10 oder mehr, 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 abspielbar ist) erstellen möchten, müssen Sie jedes Bild mehrmals duplizieren (sagen wir 10 Mal) und dann erzählen FFMPEG, um ein Video mit 10 FPS 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, den Parameter fps anstelle von

(was in einer anderen Antwort gezeigt wird), was in einigen Fällen problematisch sein kann (gemäß offizielle Dokumentation ).

ffmpeg -framerate 1 -i "img (%d).jpg" -c:v libvpx-vp9 -vf "fps=10,format=yuv420p" out.mkv 

Da die Eingabe -framerate niedriger als die Ausgabe ist fps, FFMPEG dupliziert Frames, um die gewünschte Ausgabe-Framerate zu erreichen (die gemäß dem obigen Befehl 10 beträgt).

Es ist auch wichtig zu beachten, dass die Reihenfolge -framerate ist und -vf fps ist wichtig , da diese Konfiguration auf das nächste erwähnte Video (In- oder Output) angewendet wird. Dies entspricht den offiziellen Dokumenten :

Optionen werden auf die nächste angegebene Option angewendet Datei. Daher ist die Reihenfolge wichtig …

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.