Encodage VP9 HDR

La technologie HDR (High Dynamic Range) est en cours de développement. Il existe aujourd'hui un certain nombre de normes qui s'harmonisent progressivement.

Pour en savoir plus sur l'évolution des vidéos HDR, consultez l'article Wikipédia Vidéo HDR (High Dynamic Range).

FFmpeg peut être utilisé avec VP9 pour (1) compresser des sources HDR en sorties SDR (Standard Dynamic Range) ou (2) reconditionner une source HDR dans des formats HDR adaptés au Web.

Sources d'entrée

Actuellement, lors de l'encodage HDR avec VP9, tous les codecs haute profondeur de bits (10 bits) compatibles avec FFmpeg peuvent être utilisés comme entrée (par exemple, VP9 Profile 2 et 3, H.264 (10 bits), DNxHR, HEVC, ProRes, etc.). Consultez également l'article de l'aide YouTube Mettre en ligne des vidéos HDR (High Dynamic Range).

Couverture de la sortie encodée :

Actuellement et en général, les appareils cibles compatibles incluent tout appareil capable de décoder le profil 2 du VP9 et d'afficher le contenu sur un écran HDR.

  • Chromecast Ultra + téléviseur compatible HDR
  • Chrome 64 Canary sur Windows 10 Fall Creators Update, avec le flag HDR activé. (Il s'agit d'un bon outil de débogage.)
  • Tout téléviseur HDR avec VP9 Profile 2
    • Tous les modèles HDR Samsung de 2017 (liste sur flatpanelshd.com) et les modèles de 2016 commençant par "KS"
    • Tous les modèles HDR LG de 2017 (et certains modèles LG G6 de 2016)
    • Sur mobile, appareils prenant en charge le décodage matériel du profil 2 du VP9 HDR 10 bits (Meizu Pro 7)
    • UHD Blu-ray de 2017

Paramètres de ligne de commande FFmpeg pour activer le profil 2 du VP9 et les EOTF HDR

Votre FFmpeg devra avoir été conçu avec une prise en charge 10 bits (ou même 12 bits).

Dans les exemples ci-dessous, nous utilisons un ffmpeg compilé de manière statique avec une prise en charge de 10 bits. Vous pouvez utiliser notre script de compilation pour créer le vôtre ou suivre les conseils sur le site FFmpeg.

Vous trouverez ci-dessous une ligne de commande FFmpeg utilisable pour l'encodage HDR selon les normes SMPTE 2084 (PQ EOTF) avec VP9 :

ffmpeg -i strobe_scientist_18Mbps.webm -b:v 18000000 -pass 1 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate 26800000 -minrate 8040000 -profile:v 2 -vcodec libvpx-vp9 /dev/null && \
   ffmpeg -i strobe_scientist_18Mbps.webm -b:v 18000000 -pass 2 \
   -pix_fmt yuv420p10le \
   -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
   -maxrate 26800000 -minrate 8040000 -profile:v 2 -vcodec libvpx-vp9 \
   strobe_scientist_18Mbps.webm

Voici les principaux paramètres présentés ici :

ffmpeg Version statique avec prise en charge 10 bits
-pass 1 Le format HDR nécessite un encodage en deux passes. Dans cet exemple, la première passe est générée dans /dev/null et traitée en mémoire lors de la deuxième passe.
-pix_fmt yuv420p10le Définit le format de pixel YUV 4:2:0 10 bits
-color_primaries 9 Ensembles BT2020 Pour en savoir plus, consultez les pages 5 et 6 de ce document.
-color_trc 16 16 définit les caractéristiques de transfert sur SMPTE 2084. PQ 18 définit les caractéristiques de transfert SMPTE 2086 HLG
-colorspace 9 colorspace correspond à "matrix_coefficients". Cette valeur doit être définie de manière cohérente avec la façon dont le contenu a été masterisé. (par exemple, bt709, bt2020_ncl). Dans cet exemple, il doit s'agir de 9 pour bt2020_ncl. Pour plus d'informations, consultez la page 12 de ce document.
-color_range 1 Gamme de couleurs (0 = non spécifié, 1 = mpeg/studio/tv, 2 = jpeg/full/pc)
-profile:v 2 Pour le HDR, un profil ou 2 ou 3 est requis.
-vcodec libvpx-vp9 Utilisez l'encodeur VP9.

Exemples d'encodages

Les exemples suivants utilisent tous le fichier source strobe_scientist.mkv.

En règle générale, pour l'encodage HDR, nous recommandons un débit 25 à 30 % plus élevé que celui de l'encodage SDR 8 bits équivalent. Les exemples ciblent généralement 18 Mbit/s. De bons résultats HDR peuvent être obtenus avec des débits de 12 Mbit/s avec un réglage optimal.

Les encodages ont été effectués sur un système Ubuntu Linux avec les spécifications suivantes :

  • Processeur : 4x Intel(R) Core(TM) i5-6500 à 3,20 GHz
  • Mémoire (RAM) : 8 060 Mo (1 492 Mo utilisés)
  • Carte graphique : Intel HD Graphics 530 (Skylake GT2)
  • OS : Ubuntu 16.04 LTS

Convertir au format YUV 4:2:0 10 bits PQ

Exemple A : 6 Mbit/s 4K 2 passes
ffmpeg -y -report -i strobe_scientist.mkv -b:v 6000000 -speed 4 -pass 1 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate 8000000 -minrate 4000000 \
  -profile:v 2 -vcodec libvpx-vp9 -f webm /dev/null && \
  ffmpeg -y -report -i strobe_scientist.mkv -b:v 6000000 -pass 2 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate 8000000 -minrate 4000000 \
  -profile:v 2 -vcodec libvpx-vp9 \
  2pass_HDR_strobe_scientist_6Mbps-static.webm
Exemple B1 : 18 Mbit/s 4K 2 passes
ffmpeg -y -report -i strobe_scientist.mkv -b:v **18000000** -speed 4 -pass 1 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate **20800000** -minrate **15040000** \
  -profile:v 2 -vcodec libvpx-vp9 -f webm /dev/null && \
  ffmpeg -y -report -i strobe_scientist.mkv -b:v 18000000 -pass 2 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate **20800000** -minrate **15040000** \
  -profile:v 2 -vcodec libvpx-vp9 \
  2pass_HDR_strobe_scientist_18Mbps-static.webm
Exemple B2 : 18 Mbit/s 1080p 2 passes
ffmpeg -y -report -i strobe_scientist.mkv -b:v 18000000 -speed 4 -pass 1 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate 20800000 -minrate 15040000 \
  -profile:v 2 **-vf ****scale=-1:1080**** **-vcodec libvpx-vp9 \
  -f webm /dev/null && \
  ffmpeg -y -report -i strobe_scientist.mkv -b:v 18000000 -pass 2 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate 20800000 -minrate 15040000 \
  -profile:v 2 **-vf ****scale=-1:1080**** **-vcodec libvpx-vp9 \
  1080_2pass_HDR_strobe_scientist_18Mbps-static.webm

Convertir le HDR en SDR avec une table de conversion (LUT)

Pour convertir le HDR en SDR, le transcodeur doit comprendre comment mapper les niveaux de luminosité et les couleurs à l'espace colorimétrique BT.709 plus petit et à la plage de luminosité non HDR. Pour de meilleurs résultats, vous pouvez utiliser une LUT décrivant comment effectuer ce mappage (généralement spécifique au contenu). Les exemples C et D montrent comment utiliser une LUT. Nous avons utilisé bt2020_to_bt709_example.cube.

Exemple C : 18 Mbit/s 4K HDR vers SDR avec LUT
ffmpeg -i strobe_scientist.mkv -y -b:v 18000000 -speed 4 -pass 1 \
  -pix_fmt yuv420p \
  -color_primaries 1 -color_trc 1 -colorspace 1 -color_range 1 \
  -maxrate 26800000 -minrate 8040000 -profile:v 0 \
  -vf scale=-1:-1:in_color_matrix=bt2020,format=rgb48,lut3d=bt2020_to_bt709_example.cube,scale=-1:-1:out_color_matrix=bt709 \
  -vcodec libvpx-vp9 -f webm /dev/null && \
  ffmpeg -i strobe_scientist.mkv -y -b:v 18000000 -pass 2 \
  -pix_fmt yuv420p \
  -color_primaries 1 -color_trc 1 -colorspace 1 -color_range 1 \
  -maxrate 26800000 -minrate 8040000 -profile:v 0 \
  -vf scale=-1:-1:in_color_matrix=bt2020,format=rgb48,lut3d=bt2020_to_bt709_example.cube,scale=-1:-1:out_color_matrix=bt709 \
  -vcodec libvpx-vp9 -f webm SDR_strobe_scientist_18Mbps-static.webm

Convertir HLG en VP9-HLG10 10 bits PQ

Nécessite une source HLG. Nous avons utilisé le fichier d'entrée strobe_scientist_hlg.mkv.

Exemple D : 18 Mbit/s 4K 2 passes HLG
ffmpeg -y -i strobe_scientist_hlg.mkv -b:v 18000000 -pass 1 -speed 4 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 18 -colorspace 9 -color_range 1 \
  -maxrate 26800000 -minrate 8040000 \
  -profile:v 2 -vcodec libvpx-vp9 -f webm /dev/null && \
  ffmpeg -y -i strobe_scientist_hlg.mkv -b:v 18000000 -pass 2 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 18 -colorspace 9 -color_range 1 \
  -maxrate 26800000 -minrate 8040000 \
  -profile:v 2 -vcodec libvpx-vp9 \
  HLG_HDR_strobe_scientist_18Mbps-static.webm

Résumé

La taille des fichiers de sortie varie. L'entrée était de 4,3 Go.

Exemple Sortie cible Taille sur le disque Heure d'encodage
A 6 Mbit/s 4K non mis à l'échelle HDR 51,2 Mo 142 m
B1 18 Mbit/s 4K HDR non mis à l'échelle 161 Mo 213 m
B2 18 Mbit/s 1080p HDR mis à l'échelle 160 Mo 113 m
C 18 Mbit/s HDR vers SDR non mis à l'échelle 165 Mo 124 m
D Conversion HLG à 18 Mbit/s 165 Mo 168 m

Notez que l'encodage en deux passes est recommandé pour le HDR, car l'encodage en une passe peut varier dans certaines configurations.

Outils nécessaires pour signaler le HDR dans les sorties WebM et MP4 (outils de ligne de commande Matroska)

Au moment de la rédaction de cet article, FFmpeg ne fournit pas de mécanisme permettant de spécifier des métadonnées statiques SMPTE 2086 dans WebM/MKV, mais il les propagera à partir d'un flux d'entrée lorsque le flux en contient.

L'outil mkvmerge, qui fait partie de mkvtoolnix, peut être utilisé pour insérer ou modifier ces métadonnées si votre application l'exige.

Voici un exemple d'insertion de métadonnées HDR dans l'un des fichiers créés ci-dessus. Il est particulièrement adapté à la préparation de contenus HDR à mettre en ligne sur YouTube.

mkvmerge \
  -o HDR_strobe_scientist_18Mbps.mkv\
  --colour-matrix 0:9 \
  --colour-range 0:1 \
  --colour-transfer-characteristics 0:16 \
  --colour-primaries 0:9 \
  --max-content-light 0:1000 \
  --max-frame-light 0:300 \
  --max-luminance 0:1000 \
  --min-luminance 0:0.01 \
  --chromaticity-coordinates 0:0.68,0.32,0.265,0.690,0.15,0.06 \
  --white-colour-coordinates 0:0.3127,0.3290 \
  HDR_strobe_scientist_18Mbps.webm

Cet exemple produit le fichier HDR_strobe_scientist_18Mbps.mkv en 0,6 seconde.