URL: https://linuxfr.org/users/elyotna/journaux/hevc-vp9-x265-vs-libvpx
Title: HEVC/VP9 : x265 vs libvpx
Authors: Ely
Date: 2014-11-19T20:02:07+01:00
License: CC By-SA
Tags: hevc, i2bp, x265, vp9, libvpx, x264 et h264
Score: 47
Bonjour à tous !
[La dernière fois](https://linuxfr.org/users/elyotna/journaux/hevc-h-265-et-x265-mes-premiers-tests), je vous ai vanté les mérites du futur codec vidéo [HEVC](http://fr.wikipedia.org/wiki/H.265/HEVC) contre son prédécesseur [H.264](http://fr.wikipedia.org/wiki/H.264).
Ce qui nous intéresse aujourd'hui, c'est comment HEVC se compare face à son concurrent [VP9](http://fr.wikipedia.org/wiki/VP9), qui a été racheté par google il y a cinq ans.
L'écriture de ce journal m'est venue car j'ai récemment remarqué que mes vidéos youtube se jouaient toutes en VP9 depuis quelques mois (avec le lecteur HTML5 sous chrome).
Google essaie de pousser son nouveau codec en forçant son utilisation sur la plateforme de vidéo la plus populaire au monde.
La question est donc : VP9, ça vaut quoi ?
Je vous propose donc un petit face-à-face entre VP9 et HEVC, mais également une comparaison avec l'ancien H.264.
# Les encodeurs
## x265
X265 est un encodeur HEVC nommé après le très célèbre x264 pour H.264. Il est open-source et développé par la société multicoreware.
J'utiliserai la version 1.4 sortie le 3 novembre 2014, et je mux le résultat dans des fichiers [MKV](http://fr.wikipedia.org/wiki/Matroska).
Je me suis fourni sur le repo mercurial disponible sur [bitbucket](https://bitbucket.org/multicoreware/x265/commits/all).
## libvpx
La libvpx, c'est le projet de google qui rassemble des bibliothèques de décodage/codage pour VP8 et VP9. C'est la seule implémentation logicielle pour VP9 qui existe.
J'utiliserai la dernière révision git, tout simplement parce que la dernière version (1.3.0) date de novembre 2013 et est indiquée comme "expérimentale pour VP9".
Je mux le résultat dans des fichiers [WebM](http://fr.wikipedia.org/wiki/WebM).
Je me suis fourni sur le repo git disponible [ici](https://chromium.googlesource.com/webm/libvpx/).
## x264
On ne le présente plus, j'utiliserai l'encodeur x264 build 142 pour les échantillons H.264.
## Lecture
Pour la lecture, j'ai utilisé Media Player Classic HC sous windows. J'aurais bien voulu utiliser VLC, mais même en 2.2.0-rc1 j'ai rencontré de gros problèmes de performances en lecture de flux HEVC, et la moitié des vidéos VP9 étaient corrompues.
Sous linux, on doit pouvoir les regarder avec mplayer ou ffplay/avplay.
# Paramètres d'encodage
Comme comparer deux codecs vidéo ne peut se faire qu'à bitrate égal, j'utilise des encodages en deux passes pour avoir un bitrate moyen égal.
J'ai téléchargé les échantillons au format brut YUV420 sur http://media.xiph.org/video/derf/.
## x265
J'utilise un encodage en deux passes avec un preset "slower". Niveau ligne de commande ça ressemble à ça :
```bash
x265 --input --pass 1 --bitrate --preset slower --stats .stats /dev/null
x265 --input --pass 2 --bitrate --preset slower --stats .stats out.hevc
```
Je me permets l'utilisation de ce preset car la libvpx-vp9 est, on le verra, très lente. Ca serait un désavantage de ne pas pousser les réglages de x265 car, avec ceux par défaut, il compresse 8x plus rapidement que la libvpx.
## x264
Tout pareil :
```bash
ffmpeg -y -i -vcodec libx264 -b:v k -pass 1 -p slower -f h264 /dev/null
ffmpeg -y -i -vcodec libx264 -b:v k -pass 2 -p slower out.mkv
```
## libvpx
Idem, excepté qu'il n'y a pas de notion de preset. Au niveau ligne de commande :
```bash
ffmpeg -y -i -c:v libvpx-vp9 -b:v k -pass 1 -f webm /dev/null
ffmpeg -y -i -c:v libvpx-vp9 -b:v k -pass 2 -f webm out.webm
```
## Side-by-side
Nouveauté dans ce journal, je vous propose aussi des vues "side-by-side" des deux vidéos, avec à gauche une moitié VP9 et à droite une moitié HEVC. Les deux moitiés sont séparées par une barre noire.
Du coup, je dois réencoder les deux vidéos précédentes. Pour éviter de gommer les différences entre les deux, j'ai choisi d'encoder le résultat en H.264 avec un CRF à 19, réputé pour être "quasi lossless" visuellement parlant.
Les fichiers side-by-side sont donc beaucoup plus gros que les deux autres.
# Les tests
## Crowd run (3840x2160@50, 10s)
On commence avec un sample 4K (3840x2160) de 10 secondes où l'on voit un marathon au premier plan.
Le bitrate est de 7'150 kbps. Ce n'est pas tout à fait suffisant pour un tel flux, mais ça permettra de mieux exposer les différences entre les deux codecs.
* [crowd_run_2160p50-x265.mkv](http://185.53.129.138/videos/crowd_run_2160p50-x265.mkv)
* [crowd_run_2160p50-vp9.webm](http://185.53.129.138/videos/crowd_run_2160p50-vp9.webm)
* [crowd_run_2160p50-x264.mkv](http://185.53.129.138/videos/crowd_run_2160p50-x264.mkv)
* [crowd_run_2160p50-side.mkv](http://185.53.129.138/videos/crowd_run_2160p50-side.mkv)
Je m'excuse d'avance pour les propriétaires de grille-pains qui auront du mal à lire du 4K@50fps de façon fluide.
Analyse :
Pour moi, HEVC est vainqueur de cette comparaison. Les coureurs au premier plan sont plus nets, mais ce qui choque c'est surtout ce qui se passe dans le fond.
Avec VP9, tous les coureurs en arrière-plan apparaissent saccadés, alors qu'ils sont très fluides sur la vidéo HEVC.
Je trouve également que la qualité de l'herbe sur laquelle les gens courent est plus agréable côté HEVC.
![crowd_run-vp9-vs-x265](http://185.53.129.138/crowd_run-vp9-vs-x265.png "Gauche: VP9. Droite: HEVC")
Sans surprise, la vidéo H.264 fait pâle figure face aux deux nouveaux codecs.
Au niveau des performances :
* x265 a encodé la vidéo à 0.4fps, MPC-HC consomme 40% du CPU à la lecture.
* libvpx-vp9 a encodé la vidéo à 0.5fps, MPC-HC consomme 30% du CPU à la lecture.
## Pedestrian area (1920x1080@25, 15s)
On retourne à une résolution Full HD sur une scène où des piétons traversent une zone piétonne.
Bitrate demandé : 1'050 kbps.
* [pedestrian_area_1080p25-x265.mkv](http://185.53.129.138/videos/pedestrian_area_1080p25-x265.mkv)
* [pedestrian_area_1080p25-vp9.webm](http://185.53.129.138/videos/pedestrian_area_1080p25-vp9.webm)
* [pedestrian_area_1080p25-x264.mkv](http://185.53.129.138/videos/pedestrian_area_1080p25-x264.mkv)
* [pedestrian_area_1080p25-side.mkv](http://185.53.129.138/videos/pedestrian_area_1080p25-side.mkv)
Analyse :
Il est plus difficile d'établir un vainqueur pour cette vidéo.
J'aurais tendance à dire que HEVC l'emporte. De peu certes, les deux vidéos sont dans l'ensemble de très bonne qualité, mais l'image est légèrement plus lisse côté x265 :
![pedestrian-vp9-vs-x265](http://185.53.129.138/pedestrian-vp9-vs-x265.png "Gauche: VP9. Droite: HEVC")
La vidéo H.264, quant à elle, souffre beaucoup de ce bitrate bien trop bas pour elle et l'image est très bruitée, même les éléments statiques :
![pedestrian-x264](http://185.53.129.138/pedestrian-x264.png "H.264")
Au niveau des performances :
* x265 a encodé la vidéo à 2.25fps, MPC-HC consomme 5% du CPU à la lecture.
* libvpx-vp9 a encodé la vidéo à 1.2fps, MPC-HC consomme 4% du CPU à la lecture.
## Old Town (1280x720@50, 10s)
Un plan HD qui consiste en un travelling vu du ciel d'une ville.
Bitrate demandé : 800 kbps.
* [old_town_cross_420_720p50-x265.mkv](http://185.53.129.138/videos/old_town_cross_420_720p50-x265.mkv)
* [old_town_cross_420_720p50-vp9.webm](http://185.53.129.138/videos/old_town_cross_420_720p50-vp9.webm)
* [old_town_cross_420_720p50-x264.mkv](http://185.53.129.138/videos/old_town_cross_420_720p50-x264.mkv)
* [old_town_cross_420_720p50-side.mkv](http://185.53.129.138/videos/old_town_cross_420_720p50-side.mkv)
Analyse :
Encore une fois, il est difficile de juger les deux codecs tant les vidéos sont similaires.
De mon point de vue, HEVC a un léger avantage d'ensemble puisqu'on peut remarquer que l'image VP9 "tremble" légèerment, et il y légèrement plus de flou autour des bâtiments en hauteur. Rien de flagrant en tout cas..
![old_town-vp9-vs-x265](http://185.53.129.138/old_town-vp9-vs-x265.png "Gauche: VP9. Droite: HEVC")
Au niveau des performances :
* x265 a encodé la vidéo à 5fps, MPC-HC consomme 4% du CPU à la lecture.
* libvpx-vp9 a encodé la vidéo à 4fps, MPC-HC consomme 2,5% du CPU à la lecture.
# Bilan
Je dois dire que lorsque j'ai pensé à faire ces tests, j'avais de gros aprioris et dans ma tête, HEVC/x265 allait sortir grand vainqueur.
Pourtant, force est de constater que l'équipe derrière VP9 et son implémentation dans la libvpx ont fait un très bon boulot puisque le codec rivalise quasiment (selon moi) avec HEVC, et surtout est 25% moins demandant sur les décodeurs.
Seule la vitesse de compression très faiblarde de la libvpx fait défaut, mais ses développeurs promettent des améliorations non négligeables à venir. Notamment, la libvpx n'est pas multi-coeur pour le moment..
On sent que VP9 a bien mûri et on comprend pourquoi google commence à transcoder toutes ses vidéos youtube en vp9.
On commence à apercevoir le départ en retraite du vénérable H.264, même si ce n'est pas pour maintenant :-) . En tout cas, les releases LOL-x265 commencent à arriver dans la baie des pirates..