VP8 vs. VP9 im Vergleich

Letztes Update: 2014-08-16

Dieser Artikel ist veraltet und wurde aktualisiert: VP8 vs. VP9 im Vergleich.

VP8 ist Googles Antwort auf H.264. Google hat den Codec von On2 gekauft und dann als Open Source veröffentlicht, vorrangig um einen lizenzkostenfreien Videocodec für das eigene WebM Format anbieten zu können, das einfach per Video-Tag in HTML5 eingebunden werden kann. Aktuell spielen Firefox, Chrome und Chromium Videos im WebM Format (VP8 & Vorbis) nativ ab.

VP9 ist nun der daraus entstehende Nachfolger, der sich aktuell noch in der Entwicklung befindet. Hier nun werde ich testen, in wie weit er eine Verbesserung gegenüber VP8 darstellt, da VP9 konkurrenzfähig zu H.265 werden soll, wo die Entwicklung derzeit auch noch in vollem Gange ist, gefühlt aber etwas schneller voranschreitet.

Testvorbereitungen

Um natürlich den aktuellsten Entwicklungsstand nutzen zu können, habe ich die libvpx frisch aus dem Git-Repository installiert. Version ist v1.3.0-3873-gc602748, ffmpeg kommt in Version 2.3.2 zum Einsatz.

Die verwendete Hardware ist mein Root-Server bei Hetzner, ein Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz und 16 GB RAM.

Als Video-Material nutze ich einfach die 1080p Einzelframe-PNGs von Big Buck Bunny. Außerdem beschränke ich das Encoding auf die ersten 60 Sekunden des Films. Das reicht aus, um repräsentative Werte zu erhalten. Angemerkt sei aber, dass gerade die ersten 40 Sekunden von Big Buck Bunny schwer zu kodieren sind, da braucht der Encoder länger als beim Rest des Films. Das geht x264 dort aber genauso, ist also kein Defekt des Encoders sondern einfach nur die Komplexität des Films an der Stelle.

Da ein CRF- oder CQ-Encoding keinen qualitativen Unterschied machen würde, lege ich für das Encoding eine fixe Bitrate von 1000 kbps fest. Die Bitrate setze ich absichtlich so niedrig an, um zu sehen, welcher der beiden Codecs mehr Artefakte bildet.

Encoding

So, nun geht's an das Encoden des Films. Ich lasse VP8 in 3 Schritten durchlaufen, einmal mit nur 1 Thread, dann nochmal mit 2 und 4 Threads. Leider nutzt VP9 aktuell beim Encoding noch kein Multithreading, somit wird immer nur 1 Thread genutzt. Also nun folgende Befehle, die Ergebnisse fasse ich final in einer Tabelle zusammen.

Um noch bessere Qualität bzw. Kompression zu erreichen, kann man den Parameter "-quality best" noch hinzufügen, jedoch ist VP9 dann soo langsam, dass sich das glaub ich niemand mehr antun mag. VP8 hat dabei noch erträgliche Geschwindigkeit und es lohnt sich dort auch, den Parameter zu setzen, wenn man nicht gerade unter Zeitdruck steht, da man dadurch bei CRF- und CQ-Encoding die finale Dateigröße schon noch um ein paar Prozent verringern kann.

# VP8 - 1 Thread
ffmpeg -y -r 24 -i frames/big_buck_bunny_%05d.png -to 60 -pix_fmt yuv420p -b:v 1000k -c:v libvpx -threads 1 8.1.webm

# VP8 - 2 Threads
ffmpeg -y -r 24 -i frames/big_buck_bunny_%05d.png -to 60 -pix_fmt yuv420p -b:v 1000k -c:v libvpx -threads 2 8.2.webm

# VP8 - 3 Threads
ffmpeg -y -r 24 -i frames/big_buck_bunny_%05d.png -to 60 -pix_fmt yuv420p -b:v 1000k -c:v libvpx -threads 4 8.4.webm

# VP8 best - 1 Thread
ffmpeg -y -r 24 -i frames/big_buck_bunny_%05d.png -to 60 -pix_fmt yuv420p -quality-best -b:v 1000k -c:v libvpx -threads 1 8b.1.webm

# VP8 best - 2 Threads
ffmpeg -y -r 24 -i frames/big_buck_bunny_%05d.png -to 60 -pix_fmt yuv420p -quality-best -b:v 1000k -c:v libvpx -threads 2 8b.2.webm

# VP8 best - 4 Threads
ffmpeg -y -r 24 -i frames/big_buck_bunny_%05d.png -to 60 -pix_fmt yuv420p -quality-best -b:v 1000k -c:v libvpx -threads 4 8b.4.webm

# VP9 - 1 Thread
ffmpeg -y -r 24 -i frames/big_buck_bunny_%05d.png -to 60 -pix_fmt yuv420p -b:v 1000k -c:v libvpx-vp9 -threads 1 9.1.webm

Ergebnis

CodecThreadsBitrateSpeed
VP81979.5 kbps2.9 fps
VP82990.2 kbps5.1 fps
VP841003.9 kbps7.0 fps
VP8 best1980.3 kbps1.1 fps
VP8 best21004.8 kbps2.6 fps
VP8 best41029.2 kbps4.0 fps
VP91966.6 kbps0.7 fps

Bildqualität

Ich habe nun 3 Stellen in dem Film herausgepickt und jeweils 1 Frame aus den einzelnen Encodes gezogen. Ich werde nun nicht alle hier zeigen, da die VP8 Encodes sich nur minimal in der Bildqualität unterscheiden. Ich vergleiche hier nun direkt VP9 sowie VP8 best mit 1 Thread an. Links ist immer VP9, rechts VP8. Erste Reihe das Gesamtbild, zweite Reihe dann ein Bildausschnitt, wo die Unterschiede am deutlichsten werden.

Position 00:15

Position 00:30

Position 00:55

Auswertung

Wie man ja auf so ziemlich allen Frames erkennt, schafft VP9 es tatsächlich, z.B. die Details des Grases wesentlich besser zu erhalten und wirkt weniger matschig. Erschreckend ist aber bei Position 00:55 z.B. die schnelle Bewegung des Hasen, wo VP9 furchtbaren Pixelbrei erzeugt, während VP8 an der Stelle wirklich gut die Bewegung umsetzt.

Alles in allem ist VP9 schon auf einem guten Weg, jedoch die Probleme bei schnellen Bewegungen sollten definitiv noch behoben werden. Praktisch einsetzen sollte man VP9 aktuell ja ohnehin noch nicht. Ich werde auf jeden Fall die weitere Entwicklung beobachten und ggfs. einen neuen Beitrag verfassen, sobald es sich lohnt.