Ich erstelle derzeit Webm-Videos mit ffmpeg, um eine Bildsequenz zu codieren. Mein Befehl lautet:
ffmpeg -framerate 30 -f image2 -i frames/%04d.png -i my_audio.flac -c:v libvpx-vp9 -pix_fmt yuva420p -b:v 0 -tile-columns 2 -crf 18 -c:a libopus -b:a 128k -r 30 -g 300 -y my_video.webm
Der webm VP9-Kodierungsleitfaden scheint nur Beispiele für die 2-Pass-Kodierung mit ffmpeg aufzulisten. Und für Bildsequenzen scheint ihr Beispiel nicht einmal ffmpeg zu verwenden.
Ich frage mich also, ob es möglich ist, Bildsequenzen mit ffmpeg und libvp9 in zwei Durchgängen zu codieren? Wenn ja, was wäre das Äquivalent zu meinem Single-Pass-Befehl? Gibt es in diesem Szenario einen Vorteil bei der Verwendung des 2-Pass-Ansatzes anstelle eines Single-Pass-Ansatzes?
webm wiki > FFmpeg > VP9 Encoding Guide: http://wiki.webmproject.org/ffmpeg/vp9-encoding-guide
webm wiki > HOWTOs > Convert PNG frames to WebM video: http://wiki.webmproject.org/ howtos/convert-png-frames-to-webm-video
Sie würden verwenden
ffmpeg -framerate 30 -f image2 -i frames/%04d.png -pass 1 -c:v libvpx-vp9 -pix_fmt yuva420p -b:v 0 -tile-columns 2 -crf 18 -r 30 -g 300 -y -f null -
und dann
ffmpeg -framerate 30 -f image2 -i frames/%04d.png -i my_audio.flac -pass 2 -c:v libvpx-vp9 -pix_fmt yuva420p -b:v 0 -tile-columns 2 -crf 18 -c:a libopus -b:a 128k -r 30 -g 300 -y my_video.webm
In FFmpeg ist das Containerformat oder die Codierung der Eingabe an sich irrelevant, wenn es um die Verwendung von Encoderfunktionen wie Two-Pass geht.
Ist es möglich, Bildsequenzen mit ffmpeg und libvp9 in zwei Durchgängen zu codieren?
Ja, es ist möglich, eine 2-Pass-Codierung von einer PNG-Bildsequenz mit ffmpeg und VP9 durchzuführen.
Wenn ja, was wäre das Äquivalent zu meinem Single-Pass-Befehl?
Gyans Antwort entspricht in etwa dem Single-Pass-Befehl, der im ursprünglichen Post verwendet wurde. Ein alternativer Befehl ist unten aufgeführt, der wahrscheinlich bessere Ergebnisse in Bezug auf die Komprimierung liefert, während er eine mindestens genauso gute visuelle Qualität beibehält und diese möglicherweise verbessert.
Gibt es in diesem Szenario einen Vorteil bei der Verwendung des 2-Pass-Ansatzes anstelle eines Single-Pass-Ansatzes?
Hier sind drei Vorteile des 2-Pass-Ansatzes anstelle eines Single-Pass-Ansatzes speziell für den VP9-Codec:
Bestimmte Codec-Optionen werden erst mit 2-Pass-Encoding möglich und können die Qualität beeinträchtigen. Zum Beispiel auto-alt-ref
, um die Verwendung alternativer Referenzrahmen zu ermöglichen, was die visuelle Qualität verbessern kann. (Einzelheiten finden Sie im VP9-Codierungsleitfaden des Webm-Projekts.)
Potenzial für bessere Komprimierung, d. h. kleinere Ausgabevideodatei. Siehe Testergebnisse unten, wo ich mit 2-Pass eine Verbesserung von etwa 10 % erhalte.
Die Möglichkeit, Ihre Zielbitrate zu steuern, was sich in einem VoD-/Streaming-Szenario auf Sie auswirken könnte, da Sie wahrscheinlich bestimmte Bandbreitenbeschränkungen haben.
Abhängig von Ihrem Anwendungsfall kann es andere Vorteile/Gründe für die 2-Pass-Codierung mit VP9 geben. Bisher funktioniert 2-Pass mit VP9 gut für mich. In der Tat, solange ich die Zeit für eine 2-Pass-Codierung habe, würde ich jetzt nicht einmal in Betracht ziehen, eine Single-Pass-Codierung zu verwenden .
Hinweis: Ich verwende im Allgemeinen keine 2-Pass-Codierung für x264, aber für VP9 scheint es gegenüber Single-Pass zu empfehlen.
ffmpeg -framerate 30 -f image2 -i frames/%04d.png -c:v libvpx-vp9 -pass 1 -pix_fmt yuva420p -b:v 0 -tile-columns 6 -frame-parallel 1 -row-mt 1 -crf 18 -threads 8 -quality good -speed 4 -r 30 -g 300 -an -nostdin -y -f webm /dev/null
ffmpeg -framerate 30 -f image2 -i frames/%04d.png -i my_audio.flac -c:v libvpx-vp9 -pass 2 -pix_fmt yuva420p -b:v 0 -tile-columns 6 -frame-parallel 1 -row-mt 1 -crf 18 -threads 8 -quality good -speed 0 -auto-alt-ref 1 -lag-in-frames 25 -c:a libopus -b:a 128k -r 30 -g 300 -nostdin -y my_video.webm
Der Unterschied in den Flaggen im Vergleich zum ursprünglichen Beitrag und Gyans Lösung ist wie folgt:
-frame-parallel 1
: Per Webm-Projekt VP9-Kodierungsleitfaden kann Multithread-Decodierung aktiviert werden-row-mt 1
: Zeilenbasierte Multithread-Codierung für VP9 aktivieren-threads 8
: Per Webm-Projekt VP9-Kodierungsleitfaden, Bump-Kodierungsleistung-quality good -speed <integer>
: Dies ist die Qualitätsvoreinstellung, die ich möchte, und ich würde beim ersten Durchgang Geschwindigkeit 4 und beim zweiten Durchgang Geschwindigkeit 0 verwenden, wenn Sie Zeit zum Warten haben. Geschwindigkeit 1 oder 2 für den zweiten Durchgang liefern ebenfalls vernünftige Ergebnisse.-an
: Weist ffmpeg ausdrücklich an, Audio beim ersten Durchgang zu ignorieren. Es spielt möglicherweise keine Rolle, ob dieses Flag vorhanden ist, insbesondere angesichts der Nur-PNG-Eingabe beim ersten Durchgang-nostdin
: Ich führe ffmpeg in einer Schleife in einem Skript aus. Dies ist eine Möglichkeit, ffmpeg daran zu hindern, von stdin zu lesen und sich in diesem Szenario selbst zu ersticken-auto-alt-ref 1 -lag-in-frames 25
: Laut Webm-Projekt VP9-Kodierungsleitfaden werden die Alt-Ref-Frames von VP9 aktiviert ... können die Qualität verbessernIch habe einen Test mit einem Video von etwa 2 Minuten Länge durchgeführt, dessen Inhalt nur eine Bildschirmaufnahme bei 720p mit ein paar sehr einfachen visuellen Effekten war. Ich habe den obigen Befehl verwendet, um eine 2-Pass-Codierung durchzuführen, aber die Geschwindigkeit des zweiten Durchgangs war auf 1 eingestellt. Dann habe ich eine Single-Pass-Codierung durchgeführt, wobei ich nach Möglichkeit genau die gleichen Einstellungen verwendet habe, z. B. CRF, Qualität, Geschwindigkeit 1, Kachelspalten usw. Ich habe für jede Codierung dieselbe Low-Spec-Maschine verwendet.
Das Ausgabevideo für die 2-Pass-Codierung war um etwa 10 % kleiner als das Single-Pass-Ergebnis. Aber die 2-Pass-Kodierungszeit war deutlich länger ... etwa 160 % des Originals oder ungefähr 10 Minuten gegenüber 6 Minuten.
Codierungsleitfaden für das Webm-Projekt VP9: http://wiki.webmproject.org/ffmpeg/vp9-encoding-guide Codierungsoptionen für das Webm-Projekt VP8: https://sites.google.com/a/webmproject.org/wiki/ffmpeg ffmpeg VP9 Codec-Optionen: https://ffmpeg.org/ffmpeg-codecs.html#libvpx
Framerate
Gyan
-
steht für stdout, also ist das Ziel eine Pipe, die nirgendwo umgeleitet wird, also NULL.-y
kann fallen gelassen werden.Framerate
Gyan