Codifica HDR VP9

Il video HDR (High Dynamic Range) è una tecnologia ormai matura. Oggi esistono numerosi standard di armonizzazione graduale.

Per avere un quadro completo dell'evoluzione del video HDR, leggi l'articolo di WikiPedia Video ad alta gamma dinamica.

FFmpeg può essere utilizzato insieme a VP9 per (1) comprimere le sorgenti HDR negli output SDR (Standard Dynamic Range) o (2) per pacchettizzare un'origine HDR in formati HDR compatibili con il Web.

Origini di input

Attualmente, durante la codifica HDR con VP9, qualsiasi codec ad alta profondità di bit (10 bit) supportato da FFmpeg può essere utilizzato come input (ad esempio, VP9 Profilo 2 e 3, H.264 (10 bit), DNxHR, HEVC, ProRes e così via). Consulta anche l'articolo dell'assistenza di 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 il profilo VP9 2 e l'output su un display HDR.

  • Chromecast Ultra + TV compatibile con HDR
  • Chrome 64 Canary sull'aggiornamento dei creator autunnali di Windows 10, con il flag HDR attivato. Si tratta di un buon strumento di debug.
  • Qualsiasi TV HDR con profilo VP9 2
    • Tutti i modelli Samsung 2017 HDR (elenco dei dispositivi flat.sh.com) e i modelli 2016 che iniziano con "KS".
    • Tutti i modelli LG HDR del 2017 (anche alcuni modelli LG G6 del 2016)
    • Sui dispositivi mobili, che supportano la decodifica HDR a 10 bit VP9 Profilo VP9 con accelerazione hardware (Meizu Pro 7)
    • sfocatura UHD del 2017

Impostazioni della riga di comando FFmpeg per attivare i profili EVPF VP9 Profilo 2 e HDR

Il tuo FFmpeg dovrà essere stato creato con supporto a 10 bit (o anche 12 bit).

Negli esempi riportati di seguito utilizziamo una ffmpeg statica con supporto a 10 bit. Puoi utilizzare il nostro script build per creare il tuo o seguire le linee guida sul sito FFmpeg.

Di seguito è riportata una riga di comando FFmpeg utilizzabile per la codifica HDR agli 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

La suddivisione dei parametri chiave introdotti qui:

ffmpeg Build statica con supporto a 10 bit
-pass 1 La tecnologia HDR richiede la codifica a due passaggi. In questo esempio, il primo pass viene generato per /dev/null ed elaborato in memoria durante il secondo pass.
-pix_fmt yuv420p10le Imposta il formato in pixel a 10 bit YUV 4:2:0
-color_primaries 9 Imposta BT2020 Vedi i dettagli delle pagine 5 e 6 di questo documento per maggiori dettagli.
-color_trc 16 16 imposta caratteristiche di trasferimento su SMPTE 2084. PQ 18 imposta caratteristiche di trasferimento SMPTE 2086 HLG
-colorspace 9 colorspace è il"coefficiente_della_matrice." Il video deve essere impostato in modo coerente con la modalità di masterizzazione dei contenuti. (ad esempio, bt709, bt2020_ncl). In questo esempio, dovrebbe essere 9 per bt2020_ncl. Per ulteriori riferimenti, consulta la pagina 12 di questo documento
-color_range 1 Intervallo 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.

Esempi di codifica

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

Come nota generale per le velocità in bit con codifica HDR, consigliamo una velocità in bit maggiore del 25-30% rispetto alla codifica SDR a 8 bit equivalente. In genere gli esempi hanno come target 18 Mbps. È possibile ottenere buoni risultati HDR con velocità in bit di 12 Mbps con una regolazione ottimale.

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

  • Processore: 4x Intel(R) Core(TM) i5-6500 CPU a 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 pass
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 pass
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: pass 18 Mbps 1080p 2
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 dell'HDR in SDR richiede allo strumento di transcodifica per 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 ottenere risultati ottimali, puoi utilizzare una LUT che descrive come eseguire la mappatura, in genere specifica per i contenuti. Gli esempi C e D mostrano come utilizzare una LUT. Abbiamo usato bt2020_to_bt709_example.cube

Esempio C: da 18 Mbps in HDR 4k 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