Cela fait maintenant plusieurs années que je travaille dans la vidéo, et une question revient sans cesse, quelle que soit l'équipe ou le catalogue : comment construire le bon ladder ?
Quelles résolutions ? Quels débits ? Combien de paliers ? Et surtout : comment être sûr de ne pas gaspiller de bande passante sur les contenus faciles, ni sacrifier la qualité sur les contenus difficiles ?
Aujourd'hui, je publie qc, un outil open source (licence MIT) qui répond à ces questions par la mesure plutôt que par des règles empiriques.
Le problème
La plupart des ladders sont encore statiques : la même table de résolutions et de débits pour tous les titres. Pourtant, un dessin animé et un match de foot ne se compressent pas du tout de la même façon. Le premier atteint une excellente qualité avec une fraction du débit ; le second demande beaucoup plus de bits pour la même qualité perçue.
L'encodage per-title résout ce problème en théorie. En pratique, trouver le ladder optimal d'un titre demande de l'encoder de nombreuses fois, à plusieurs résolutions, et de mesurer chaque encode. Sur un titre de 10 minutes, une recherche exhaustive prend environ deux heures. Peu d'équipes peuvent se le permettre pour chaque contenu, alors elles se rabattent sur un ladder générique.
Je voulais un outil qui s'approche de l'optimum en quelques minutes, sur un simple ordinateur portable, et qui prouve ses résultats au lieu de demander de lui faire confiance.
Comment qc construit un ladder

En une commande (qc ladder source.mov -c av1), qc :
- Extrait un digest du titre : 20 segments de 2 secondes répartis sur toute la vidéo, pour que chaque type de scène soit représenté.
- Lance des encodes de sonde de ce digest à plusieurs résolutions et niveaux de qualité, et mesure chacun d'eux.
- Trace la courbe débit/qualité de chaque résolution, puis garde, à chaque débit, la résolution qui donne la meilleure qualité : l'enveloppe.
- Place les paliers sur cette enveloppe, séparés d'un écart de qualité perceptible, de VMAF 95 en haut jusqu'à la plus basse qualité utile. Vous pouvez aussi imposer votre propre forme (
--rungs 1080,720,540,360). - Vérifie chaque palier par un encode réel, et le corrige quand la mesure s'écarte de la prédiction.

C'est cette dernière étape qui compte le plus pour moi. Sur mes tests, la qualité prédite de chaque palier reste à moins de 0,8 VMAF de l'encode de vérification. Vous n'obtenez pas un joli tableau : vous obtenez un ladder dont chaque ligne a été mesurée.
qc fonctionne en H.264, HEVC et AV1, et peut comparer les codecs sur un même titre. Sur la bande-annonce de Sintel par exemple, l'enveloppe AV1 atteint VMAF 90 avec 47 % de débit en moins que H.264. Ce gain dépend énormément du contenu, et c'est justement pour ça qu'il vaut la peine d'être mesuré titre par titre.

Deux autres points qui me tiennent à cœur :
- Les ladders per-shot (
--per-shot) : qc attribue à chaque plan son propre CRF, à pente débit/qualité égale, pour la même qualité globale. Selon le contenu, le gain de débit varie, et qc vous dit ce qu'il en est sur votre titre plutôt que de promettre un chiffre fixe. - Les renditions (
--encode-ladder renditions/) : une fois le ladder construit, qc l'encode sur le titre complet et vérifie chaque rendition par rapport à la source, pour que ce que vous livrez corresponde à ce qui a été prévu.
Un VMAF fiable, en quelques secondes
Mesurer la qualité, c'est l'autre moitié du problème. Calculer le VMAF sur chaque image d'un long titre est lent ; échantillonner est rapide, mais jusqu'où peut-on faire confiance au chiffre ?
qc échantillonne les images qui comptent et donne toujours un intervalle de confiance à 95 %. Sur un film de 10 minutes, il donne 93,97 ± 0,45 en 27 secondes, là où scorer chaque image prend 160 secondes et donne 93,66, en plein dans l'intervalle.

À côté du VMAF, qc mesure XPSNR, PSNR, CAMBI (banding), SSIM et d'autres métriques sur les mêmes images, chacune avec son propre intervalle.
Et tout le reste
Un ladder ne vaut que par la source à partir de laquelle il est construit, alors qc fait aussi le contrôle technique complet d'un fichier, en un seul décodage :
- Vidéo : débit dans le temps, structure des GOP, changements de plan, complexité spatiale et temporelle (SI/TI), noirs et gels d'image, bandes noires, niveaux de luminance ;
- Audio : loudness EBU R128 et ATSC, true peak, silences, saturation, phase ;
- HDR : HDR10, HLG, MaxCLL/MaxFALL, et des métriques adaptées au HDR ;
- GPU NVIDIA : décodage NVDEC, ladders NVENC et VMAF sur CUDA.
Le tout aboutit à un rapport HTML autonome, un seul fichier qui fonctionne hors ligne, avec un verdict, les points à corriger et des graphiques zoomables, à partager avec toute l'équipe. Un rapport JSON est aussi disponible pour les pipelines.

L'essayer
qc est un binaire unique écrit en Go. Choisissez ce qui vous convient :
# Homebrew (macOS, Linux)
brew install eko/tap/qc
# Docker
docker run --rm -v "$PWD:/data" ghcr.io/eko/qc run source.mov --codecs h264,av1 --html report.html
Chaque release fournit aussi des binaires autonomes pour Linux (amd64, arm64) et macOS (Apple silicon) : seul ffmpeg est nécessaire.
Quelques commandes pour commencer :
qc # un assistant interactif
qc vmaf reference.mov encode.mp4 # le VMAF avec son intervalle de confiance
qc ladder source.mov -c av1 --per-shot # un ladder AV1 per-shot
qc run source.mov --codecs h264,av1 --html report.html # tout, dans un seul rapport
qc est aussi une bibliothèque Go : chaque étape (analyse, VMAF, ladders) est un package que vous pouvez appeler depuis vos propres services.
La suite
La prochaine étape à laquelle je réfléchis, c'est le ladder d'un programme ou d'une saison entière : repérer les scènes les plus difficiles d'un ensemble de fichiers et construire un seul ladder partagé qui tienne sa qualité sur (presque) tous les épisodes.
Ce projet rassemble une grande partie de ce que j'ai appris au fil des années. Si vous travaillez dans l'encodage ou le streaming, j'ai hâte d'avoir vos retours : testez-le sur votre prochain titre, ouvrez une issue, ou mettez une étoile au dépôt s'il vous est utile.