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