Ist es sicher, die Option yuva420 pix_format mit ffmpeg zu verwenden, um Webm-Videos zu codieren?

Ich codiere PNG-Bildsequenzen mit ffmpeg sowohl in das Webm- als auch in das MP4-Format. Mein Ziel ist es, wahrnehmbar verlustfreie Videos mit der kleinsten Dateigröße zu erstellen, die ich vernünftigerweise erreichen kann.

Die von mir produzierten Webm-Videos funktionierten gut und waren in vielen Browsern abspielbar, bis ich zu einer neueren Version von ffmpeg wechselte, die ich aus dem Quellcode kompilierte. (Die gemeldete ffmpeg-Version ist N-91380-g46fb150, was auch immer das bedeutet).

Die ausgegebenen Webm-Videos wurden in VLC immer noch gut wiedergegeben, aber Browser wie Chromium und Opera zeigten sie mit völlig verzerrten Farben an. Es sieht so aus, als ob das Blau im Video größtenteils durch Grün ersetzt wird - jedenfalls sieht es sehr seltsam aus.

Ich habe den Farbmodus mit ffprobe an den Videos überprüft, die mit alten und neuen Versionen von ffmpeg erstellt wurden:

Die alten ffmpeg-Webm-Videos, die überall funktionierten:
vp9 (Profile 1), yuv444p(tv)
Die neuen ffmpeg-Webm-Videos, die in VLC funktionieren, aber Farben in Browsern durcheinander gebracht haben:
vp9 (Profile 1), gbrp(pc, gbr/unknown/unknown, progressive)

Der von mir verwendete ffmpeg-Befehl hat keine angegeben pix_format- und ich bin mir ziemlich sicher, dass es in alten und neuen ffmpeg-Versionen so ähnlich war:
ffmpeg -framerate 30 -f image2 -i frames/%04d.png -i my_audio.flac -c:v libvpx-vp9 -b:v 0 -tile-columns 2 -crf 18 -c:a libopus -b:a 128k -r 30 -g 300 -y my_video.webm

Ich habe irgendwo darüber gelesen pix_formatund es versucht (beachten Sie die Option yuva420p):
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

Ich habe mich yuvafür stattdessen entschieden yuv, in der Hoffnung, dass es den Alphakanal aktivieren würde, weil meine Eingabe-PNG-Bilder Transparenz haben. Es schien zu funktionieren ... die Videos spielen jetzt gut in Browsern, wie mit der alten Version von ffmpeg. Im Vergleich zum alten ffmpeg-Ergebnis mit default pix_formatzeigt ffprobe einen leichten Unterschied. Es berichtet:
vp9 (Profile 0), yuv420p(tv, progressive)undalpha_mode: 1

Interessanterweise ist die Größe der ausgegebenen Webm-Datei yuva420pkleiner, als wenn ich die pix_formatOption weglasse. Mit yuva420petwa 2/3 der Größe der Ausgabedatei, die den Standardmodus verwendet gbrpund die Farben bei der Wiedergabe im Browser durcheinander bringt.

Es scheint also pix_fmt yuva420pder richtige Weg zu sein. Aber da ich wirklich keine Ahnung von Farbräumen / Pixelformaten habe, ist meine Frage: Welchen Farbmodus / welche pix_formatOption sollte ich wählen, da ich qualitativ hochwertige Webms, kleine Dateigröße und Kompatibilität mit vielen Browsern möchte? Gibt es Nachteile bei der Verwendung yuva420panstelle der Standardeinstellung gbrpoder einer anderen pix_formatOption?

Und für Bonuspunkte ;) Wenn yuva420pes in Ordnung ist, warum sollte ffmpeg den Standardwert pix_formatvon yuvauf ändern gbrp?

Antworten (1)

Die YUV-Farbcodierung mit 4:2:0-Chroma-Subsampling ist das einzige weitgehend sichere Pixelformat für die Webwiedergabe, obwohl für bestimmte Codecs möglicherweise andere Pixelformate unterstützt werden.

FFmpeg wählt das Pixelformat für die Ausgabe automatisch aus, da nicht alle Encoder alle Pixelformate unterstützen. Es wird das Pixelformat auswählen, das die Quellbittiefe, das Chroma-Sampling-Schema und das Farbcodierungsschema am besten bewahrt, aus den vom Encoder unterstützten Formaten. PNGs haben das RGB-Pixelformat und bis vor zwei Jahren unterstützte ffmpeg die Codierung von RGB-Formaten für die VPx-Encoder nicht, daher würde es ein YUV-Format mit vollem Chroma (4:4:4) auswählen. Seit RGB in FFmpeg für VPx unterstützt wird, wird eine RGB-Variante wie gbrp.

Die automatische Auswahl wird überschrieben, indem manuell angegeben wird -pix_fmt.

YUV-Streams können effizienter komprimiert werden als RGB.

Danke Gyan ... Ihre Kommentare machen genug Sinn, also akzeptiere ich diese Antwort, obwohl ich die Standardauswahl von ffmpeg für Chroma-Subsampling für die PNG-zu-VP9-Codierung eher wenig hilfreich und verwirrend finde.