Encodage HDR VP9

La vidéo HDR (High Dynamic Range) est une technologie de maturité du contenu. Aujourd'hui, un certain nombre de normes s'harmonisent progressivement.

Pour une meilleure compréhension de l'évolution de la vidéo HDR, consultez l'article Vidéo à plage dynamique dynamique de WikiPedia.

FFmpeg peut être utilisé avec le codec VP9 pour (1) compresser les sources HDR en sorties HDR (Standard Dynamic Range) ou (2) regrouper les sources HDR dans des formats compatibles avec le Web HDR.

Sources d'entrée

Actuellement, lors de l'encodage HDR avec du codec VP9, n'importe quel codecs à haute profondeur (10 bits) compatible avec FFmpeg peut être utilisé comme entrée (par exemple, profil VP9, 2 et 3, H.264 (10 bits), DNxHR, HEVC, ProRes et al.). Consultez également l'article d'assistance YouTube Mettre en ligne des vidéos HDR (High Dynamic Range).

Couverture de sortie encodée:

Actuellement, et plus généralement, les appareils cibles compatibles incluent tous ceux qui peuvent décoder le profil VP9 et générer une sortie sur un écran HDR.

  • Chromecast Ultra + téléviseur compatible HDR
  • Mise à jour des créateurs Chrome 64 Canary sous Windows 10 Fall, avec l'option HDR activée. C'est un bon outil de débogage.
  • Tous les téléviseurs HDR avec le profil VP9 2
    • Tous les modèles Samsung 2017 HDR (liste flatpanelshd.com) et les modèles 2016 commençant par &KS;
    • Tous les modèles LG 2017 HDR (et certains modèles 2016 LG G6)
    • Sur mobile, les appareils compatibles avec le décodage HDR VP9 2 10 bits à accélération matérielle (Meizu Pro 7)
    • Blu-ray HD 2017

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

Votre fichier FFmpeg doit avoir été compatible avec 10 bits (ou même 12 bits).

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

Voici une ligne de commande FFmpeg utilisable pour l'encodage HDR vers 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

Les paramètres clés présentés ici sont les suivants:

ffmpeg La version statique compatible avec 10 bits
-pass 1 Le protocole HDR nécessite un encodage 2 pass. Dans cet exemple, la première passe est générée sur /dev/null et traitée en mémoire lors de la seconde.
-pix_fmt yuv420p10le Définit le format Pixel 4:2:0 10 bits
-color_primaries 9 Définir BT2020 Consultez les pages 5 et 6 de ce document pour en savoir plus.
-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 à l'élément "matrix_coefficients". Ce paramètre doit correspondre à la manière dont le contenu a été masterisé. (par exemple, bt709, bt2020_ncl). Dans cet exemple, il doit s'agir de 9 pour bt2020_ncl. Pour en savoir plus, consultez la page 12 de ce document.
-color_range 1 Plage de couleurs (0 = non spécifiée, 1 = mpeg/studio/tv, 2 = jpeg/full/pc)
-profile:v 2 Pour le format HDR, vous devez disposer d'un profil 2 ou 3.
-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, nous recommandons d'utiliser un débit HDR de 25 à 30% supérieur à celui d'un encodage SDR 8 bits équivalent. Les exemples ciblent généralement 18 Mbit/s. Pour optimiser les résultats, vous pouvez obtenir 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: processeur 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 en YUV 4:2:1 bit 10-bit

Exemple A: 6 Mbit/s 4K
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: 2 pass 4 Mbit/s 18 Mbit/s
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: 2 pass 18 Mbit/s 1 080p
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 les contenus HDR en SDR avec une table de recherche

Pour convertir une vidéo HDR en SDR, il faut que le transcodeur comprenne comment mapper les niveaux de luminosité et les couleurs à l'espace colorimétrique BT.709 et à la plage de luminosité non HDR. Pour de meilleurs résultats, une LUT décrivant comment effectuer ce mappage (généralement spécifique au contenu) peut être utilisée. Les exemples C et D montrent comment utiliser une LUT. Nous avons utilisé bt2020_to_bt709_example.cube.

Exemple C: HDR 4K Mbit/s à 18 Mbit/s 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 PQ 10-bit HLG10 VP9

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

Exemple D: 2G Pass HLG 4K Mbit/s
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 est variable. La valeur saisie était de 4,3 Go.

Exemple Sortie cible Taille sur le disque Encoder l'heure
A Format 4K HDR non ajusté de 6 Mbit/s 51,2 Mo 142 min
B1 HDR 4K 18 Mbit/s non ajusté 161 Mo 213 min
B2 HDR 1080 Mbit/s 18 Mbit/s 160 Mo 113 min
C 18 Mbit/s HDR à SDR non ajustés 165 Mo 124 min
D Conversion HLG de 18 Mbit/s 165 Mo 168m

Notez que l'encodage en 2 pass est recommandé pour le format HDR, car le passage d'un 1 pass peut varier selon la configuration.

Outils nécessaires pour signaler la technologie 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 les métadonnées statiques SMPTE 2086 dans WebM/MKV, mais celles-ci sont propagées dans le flux d'entrée lorsque celui-ci est inclus dans le flux.

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

L'exemple suivant montre comment insérer des métadonnées HDR dans l'un des fichiers créés ci-dessus. Elle convient particulièrement aux préparations de contenus HDR pour la mise 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.