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_format
und 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 yuva
fü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_format
zeigt ffprobe einen leichten Unterschied. Es berichtet:
vp9 (Profile 0), yuv420p(tv, progressive)
undalpha_mode: 1
Interessanterweise ist die Größe der ausgegebenen Webm-Datei yuva420p
kleiner, als wenn ich die pix_format
Option weglasse. Mit yuva420p
etwa 2/3 der Größe der Ausgabedatei, die den Standardmodus verwendet gbrp
und die Farben bei der Wiedergabe im Browser durcheinander bringt.
Es scheint also pix_fmt yuva420p
der richtige Weg zu sein. Aber da ich wirklich keine Ahnung von Farbräumen / Pixelformaten habe, ist meine Frage: Welchen Farbmodus / welche pix_format
Option 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 yuva420p
anstelle der Standardeinstellung gbrp
oder einer anderen pix_format
Option?
Und für Bonuspunkte ;) Wenn yuva420p
es in Ordnung ist, warum sollte ffmpeg den Standardwert pix_format
von yuv
auf ändern gbrp
?
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.
Framerate