Ist es möglich, 2-Pass-Codierung zu verwenden, um vp9 / webm-Videos aus einer Bildsequenz zu erstellen?

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?

Verweise:

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

Antworten (2)

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.

Danke Gjan. Was bewirkt der nachgestellte Bindestrich in Ihrem ersten Pass-Befehl? Ist es erforderlich? Ich gehe davon aus, dass das -y im ersten Durchgang nicht erforderlich ist, da Sie die Ausgabe gesendet haben ...
Das Trailing -steht für stdout, also ist das Ziel eine Pipe, die nirgendwo umgeleitet wird, also NULL. -ykann fallen gelassen werden.
Interessanterweise behält der trac.ffmpeg.org 2-Pass Encoding Guide für x264 das -y für den ersten Durchgang bei, obwohl die Ausgabe an /dev/null geht. Nicht sicher warum, aber ich denke, sie haben Gründe. Ich habe Ihre Antwort akzeptiert, da sie ziemlich direkt ist und dem Befehl im ursprünglichen Beitrag sehr nahe kommt ... obwohl ich mit dem von mir geposteten Befehl bessere Ergebnisse erziele.
Werde das im Wiki ändern. Sie haben nur nach Syntax gefragt, nicht nach optimalen Befehlen zum Codieren :)

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:

  1. 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.)

  2. Potenzial für bessere Komprimierung, d. h. kleinere Ausgabevideodatei. Siehe Testergebnisse unten, wo ich mit 2-Pass eine Verbesserung von etwa 10 % erhalte.

  3. 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.

Alternativer 2-Pass-Befehl für den Single-Pass des OP

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 verbessern

Testergebnisse mit 2-Pass statt Single-Pass

Ich 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.

Verweise

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