Qu’est-ce que la vidéo à 8 bits ?
La vidéo à 8 bits stocke chaque composante de couleur de chaque échantillon sous forme d’un entier sur 8 bits, ce qui donne 256 valeurs de code possibles par composante. C’est la seule profondeur de bits de VP8 et des profils Constrained Baseline, Main et High de H.264, tandis que la norme ITU-R BT.2100 spécifie ses signaux HDR à valeurs entières sur 10 ou 12 bits.
Fonctionnement de la vidéo à 8 bits
La profondeur de bits est le nombre de bits utilisés pour quantifier chaque composante d’un échantillon. Huit bits donnent 256 codes, mais la plage du signal détermine lesquels portent l’image. La norme de TVHD ITU-R BT.709 place le noir au code 16 et le blanc de crête nominal au code 235 pour la luma et R′G′B′, centre les composantes de différence de couleur sur 128 dans la plage allant de 16 à 240 et réserve 0 et 255 aux références de synchronisation ; la vidéo à plage complète utilise plutôt les valeurs allant de 0 à 255. Le codage sur 10 bits de cette même norme va de 64 à 940, avec quatre pas pour chaque pas sur 8 bits. Cet espacement plus grossier sur 8 bits explique pourquoi les dégradés peuvent présenter des bandes visibles en dessous de 10 bits par composante. Le sous-échantillonnage de chrominance et la plage sont choisis indépendamment de la profondeur de bits : un format de pixels désigne une combinaison de profondeur de bits et de disposition de la chrominance, un profil de codec limite les combinaisons qu’un flux peut utiliser, et la plage est normalement signalée par une métadonnée distincte. Le HDR fait exception à cette liberté : BT.2100 définit les signaux PQ et HLG à valeurs entières uniquement sur 10 ou 12 bits.
Points clés
- Le fait qu’un code sur 8 bits représente le noir, le blanc ou ni l’un ni l’autre dépend de la plage du signal. En plage limitée (TV ou MPEG), le noir de luma vaut 16 et le blanc nominal 235, avec des valeurs de différence de couleur allant de 16 à 240 ; en plage complète (PC ou JPEG), l’échelle va de 0 à 255. Une vidéo à plage limitée interprétée comme étant à plage complète perd du contraste, car le noir et le blanc se situent à 16 et 235 au lieu de 0 et 255. Veillez donc à ce que la métadonnée de plage reste cohérente avec les échantillons à chaque conversion et mettez-la à jour dès qu’une conversion modifie la plage. YouTube, par exemple, convertit les vidéos téléversées à plage complète en plage limitée.
- Un profil de codec limite les profondeurs de bits et les formats de chrominance qu’un flux peut utiliser. Les profils Constrained Baseline, Main et High de H.264, HEVC Main, VP9 Profile 0 et VP8 sont limités à 8 bits avec une chrominance 4:2:0 (H.264 High permet aussi le monochrome), si bien que les deux codecs vidéo que chaque navigateur WebRTC doit implémenter, VP8 et H.264 Constrained Baseline, sont exclusivement sur 8 bits. Le format 4:2:0 sur 10 bits nécessite un profil supérieur tel que H.264 High 10, HEVC Main 10 ou VP9 Profile 2, et les formats 4:2:2 ou 4:4:4 sur 8 bits nécessitent des profils tels que H.264 High 4:2:2, H.264 High 4:4:4 Predictive ou VP9 Profile 1. H.264 High 10 et HEVC Main 10 acceptent aussi la vidéo sur 8 bits : le nom du profil ne suffit donc pas à établir la profondeur de bits.
- Le transcodage ne garantit pas à lui seul une sortie 4:2:0 sur 8 bits. Le guide d’encodage H.264 de FFmpeg avertit que, selon la source, la sortie peut utiliser un format de pixels que QuickTime et la plupart des autres lecteurs ne peuvent pas lire, et conseille de demander explicitement
yuv420p. Dans la nomenclature de FFmpeg,yuv420pcorrespond au format 4:2:0 sur 8 bits etyuv420p10leest son équivalent sur 10 bits : vérifiez donc le format de pixels de la source et de la sortie. Un format de pixels ne décrit pas la fonction de transfert, et FFmpeg documente le mappage tonal entre plages dynamiques comme un filtre distinct,tonemap: demanderyuv420pne transforme donc pas une source PQ ou HLG en SDR. - Réduire à 8 bits un contenu d’une profondeur de bits supérieure peut introduire des bandes dans les zones presque uniformes, et le tramage n’est pas une solution garantie. Le filtre
zscalede FFmpeg propose un tramage ordonné, aléatoire ou par diffusion d’erreur, mais n’en applique aucun par défaut. FFmpeg indique que son filtre de réduction des bandesgradfunest réservé à la lecture, car la compression avec perte tend à supprimer le tramage et à faire réapparaître les bandes.
Quand la vidéo à 8 bits est importante
Choisissez une sortie sur 8 bits pour une diffusion à plage dynamique standard qui doit être lisible sur le plus grand nombre de navigateurs et de lecteurs, et demandez explicitement le format de pixels, car un encodeur peut sinon conserver un format source d’une profondeur de bits supérieure ou 4:2:2. La profondeur de bits n’est pas la plage dynamique : une source sur 10 bits n’est pas nécessairement HDR, et réduire une source HDR à un format de pixels sur 8 bits ne la convertit pas à lui seul en SDR. Prévoyez au moins 10 bits avec une fonction de transfert PQ ou HLG pour une diffusion HDR, et inspectez d’abord les zones presque uniformes et les dégradés lisses lorsque vous recherchez des bandes dans un encodage sur 8 bits.
Comment Transloadit vous aide avec la vidéo à 8 bits
Le Robot /video/encode de Transloadit transmet les options de son paramètre ffmpeg à FFmpeg, et ces options priment sur le préréglage choisi. Une Assembly peut donc demander explicitement une sortie 4:2:0 sur 8 bits, par exemple avec pix_fmt réglé sur yuv420p, plutôt que de dépendre de la source ou du préréglage.
Les tableaux de préréglages indiquent le conteneur, les codecs, les débits binaires et la résolution, mais pas le format de pixels : inspectez donc le fichier encodé pour confirmer sa profondeur de bits.
Références
- Recommandation ITU-R BT.709-6 : valeurs des paramètres des normes de TVHD (PDF)
- Recommandation ITU-R BT.2100-3 : valeurs des paramètres d’image pour la télévision à grande plage dynamique (PDF)
- MDN : guide des codecs vidéo pour le Web
- Projet WebM : profils de codage VP9
- RFC 7742 : exigences de WebRTC en matière de traitement vidéo et de codecs
- Wiki FFmpeg : guide d’encodage vidéo H.264
- Documentation des filtres FFmpeg (scale, zscale, gradfun, tonemap)
- Code source de FFmpeg n7.1 : définitions des formats de pixels dans libavutil/pixfmt.h
- Aide YouTube : paramètres d’encodage recommandés pour les téléversements
- Aide YouTube : téléverser des vidéos à grande plage dynamique (HDR)