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
- Fichier de sortie : 2pass_HDR_strobe_scientist_6Mbps-static.webm
- Durée de l'encodage : 142 min 30 s
- Taille du fichier sur le disque : 51,2 Mo
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
- Fichier de sortie : 2pass_HDR_strobe_scientist_18Mbps-static.webm
- Durée de l'encodage : 213 min 32 s
- Taille du fichier sur le disque : 161 Mo
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
- Fichier de sortie : 1080_2pass_HDR_strobe_scientist_18Mbps-static.webm
- Durée de l'encodage : 113 min 9 s
- Taille du fichier sur le disque : 160 Mo
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
- Fichier de sortie : SDR_strobe_scientist_18Mbps-static.webm
- Durée de l'encodage : 124 min 23 s
- Taille du fichier sur le disque : 165 Mo
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
- Fichier de sortie : HLG_HDR_strobe_scientist_18Mbps-static.webm
- Durée de l'encodage : 186 min 10 s
- Taille du fichier sur le disque : 165 Mo
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.