Codifica HDR VP9

I video HDR (High Dynamic Range) sono una tecnologia in fase di sviluppo. Oggi esistono diversi standard che vengono armonizzati gradualmente.

Per una panoramica dell'evoluzione dei video HDR, consulta l'articolo di Wikipedia High-dynamic-range video.

FFmpeg può essere utilizzato insieme a VP9 per (1) comprimere le sorgenti HDR in output SDR (Standard Dynamic Range) o (2) per ricompattare una sorgente HDR in formati HDR compatibili con il web.

Origini di input

Attualmente, durante la codifica HDR con VP9, è possibile utilizzare come input qualsiasi codec ad alta profondità di bit (10 bit) supportato da FFmpeg (ad esempio VP9 Profilo 2 e 3, H.264 (10 bit), DNxHR, HEVC, ProRes e altri). Consulta anche l'articolo del Centro assistenza YouTube Caricare video HDR (High Dynamic Range).

Copertura dell'output codificato:

Attualmente e in generale, i dispositivi di destinazione supportati includono qualsiasi dispositivo in grado di decodificare VP9 Profile 2 e di riprodurre su un display HDR.

  • Chromecast Ultra + TV compatibile con HDR
  • Chrome 64 Canary su Windows 10 Fall Creators Update, con il flag HDR attivato. (Questo è un buon strumento di debug).
  • Qualsiasi TV HDR con VP9 Profilo 2
    • Tutti i modelli HDR Samsung 2017 (elenco su flatpanelshd.com) e i modelli 2016 che iniziano con "KS"
    • Tutti i modelli HDR LG 2017 (e alcuni modelli LG G6 del 2016)
    • Su dispositivi mobili, dispositivi che supportano la decodifica hardware VP9 profilo 2 Decodifica HDR a 10 bit (Meizu Pro 7)
    • Blu-ray UHD del 2017

Impostazioni della riga di comando FFmpeg per attivare VP9 Profile 2 e EOTF HDR

FFmpeg deve essere stato creato con il supporto a 10 bit (o anche 12 bit).

Negli esempi riportati di seguito utilizziamo un ffmpeg creato staticamente con supporto a 10 bit. Puoi utilizzare il nostro script di compilazione per crearne uno personalizzato o seguire le indicazioni sul sito di FFmpeg.

Di seguito è riportata una riga di comando FFmpeg utilizzabile per la codifica HDR secondo gli standard SMPTE 2084 (PQ EOTF) con 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

Analizziamo i parametri chiave introdotti qui:

ffmpeg La build statica con supporto a 10 bit
-pass 1 L'HDR richiede la codifica a due passaggi. In questo esempio, il primo passaggio viene inviato a /dev/null ed elaborato in memoria durante il secondo passaggio.
-pix_fmt yuv420p10le Imposta il formato pixel YUV 4:2:0 a 10 bit
-color_primaries 9 Set BT2020 Per ulteriori dettagli, consulta le pagine 5 e 6 di questo documento.
-color_trc 16 16 imposta le caratteristiche di trasferimento su SMPTE 2084. PQ 18 imposta le caratteristiche di trasferimento SMPTE 2086 HLG
-colorspace 9 colorspace è "matrix_coefficients". Questo valore deve essere impostato in modo coerente con la masterizzazione dei contenuti. (ad es. bt709, bt2020_ncl). In questo esempio, dovrebbe essere 9 per bt2020_ncl. Per ulteriori informazioni, consulta la pagina 12 di questo documento.
-color_range 1 Gamma di colori (0 = non specificato, 1 = mpeg/studio/tv, 2 = jpeg/full/pc)
-profile:v 2 Per l'HDR, è necessario un profilo o 2 o 3.
-vcodec libvpx-vp9 Utilizza il codificatore VP9.

Esempio di codifica

Gli esempi riportati di seguito utilizzano tutti il file di origine strobe_scientist.mkv

Come nota generale sulle velocità in bit con codifica HDR, si consiglia una velocità in bit superiore del 25-30% rispetto alla codifica SDR a 8 bit equivalente. Gli esempi in genere hanno come target 18 Mbps. È possibile ottenere buoni risultati HDR con bit rate di 12 Mbps con una regolazione ottimale.

Le codifiche sono state eseguite su un sistema Ubuntu Linux con le seguenti specifiche:

  • Processore: 4x Intel(R) Core(TM) i5-6500 CPU @ 3,20 GHz
  • Memoria (RAM): 8060 MB (1492 MB utilizzati)
  • Grafica: Intel HD Graphics 530 (Skylake GT2)
  • Sistema operativo: Ubuntu 16.04 LTS

Converti in YUV 4:2:0 a 10 bit PQ

Esempio A: 6 Mbps 4k 2 passaggi
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
Esempio B1: 18 Mbps 4k 2 passaggi
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
Esempio B2: 18 Mbps 1080p 2 passaggi
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

Convertire l'HDR in SDR con una tabella di ricerca (LUT)

La conversione da HDR a SDR richiede al transcodificatore di comprendere come mappare i livelli di luminosità e i colori allo spazio colore BT.709 più piccolo e alla gamma di luminosità non HDR. Per risultati ottimali, è possibile utilizzare una LUT che descriva come eseguire la mappatura, in genere specifica per i contenuti. Gli esempi C e D mostrano come utilizzare una LUT. Abbiamo utilizzato bt2020_to_bt709_example.cube

Esempio C: 18 Mbps 4K HDR a SDR con 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

Converti HLG in VP9 HLG10 PQ a 10 bit

Richiede una sorgente HLG. Abbiamo utilizzato il file di input strobe_scientist_hlg.mkv

Esempio D: 18 Mbps 4k 2-Pass 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

Riepilogo

I file di output hanno dimensioni variabili. L'input era di 4,3 GB.

Esempio Output target Dimensioni su disco Ora codifica
A 6 Mbps 4k HDR non scalato 51,2 MB 142m
B1 18 Mbps 4k HDR non scalato 161MB 213m
B2 18 Mbps 1080 HDR scalato 160MB 113 min
C 18Mbps HDR to SDR unscaled 165MB 124m
D Conversione HLG a 18 Mbps 165MB 168 min

Tieni presente che la codifica a due passaggi è consigliata per l'HDR, poiché quella a un passaggio può variare in determinate configurazioni.

Strumenti necessari per segnalare l'HDR nell'output WebM e MP4 (strumenti a riga di comando Matroska)

Al momento della stesura, FFmpeg non fornisce un meccanismo per specificare i metadati statici SMPTE 2086 in WebM/MKV, anche se li propaga da un flusso di input quando il flusso li contiene.

Lo strumento mkvmerge, parte di mkvtoolnix, può essere utilizzato per inserire o modificare questi metadati se la tua applicazione lo richiede.

Di seguito è riportato un esempio di inserimento dei metadati HDR in uno dei file creati sopra. È particolarmente adatto per preparare i contenuti HDR per il caricamento su 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

Questo esempio produce il file HDR_strobe_scientist_18Mbps.mkv in 0,6 secondi.