Codificación HDR VP9

El video de alto rango dinámico (HDR) es una tecnología que se está desarrollando. Hoy en día, existen varios estándares que se unifican gradualmente.

Para obtener una imagen mantenida de la evolución del video HDR, consulta el artículo de WikiPedia sobre videos de rango dinámico alto.

FFmpeg se puede usar junto con VP9 para (1) comprimir las fuentes HDR en salidas de rango dinámico estándar (SDR) o (2) volver a empaquetar una fuente HDR en formatos HDR compatibles con la Web.

Fuentes de entrada

Actualmente, cuando se codifica HDR con VP9, se pueden usar códecs de profundidad alta de bits (10 bits) compatibles con FFmpeg como entrada (por ejemplo, perfiles 2 y 3 de VP9, H.264 (10 bits), DNxHR, HEVC, ProRes y otros). Consulta también el artículo de asistencia de YouTube sobre cómo subir videos de alto rango dinámico (HDR).

Alcance de salida codificado:

Actualmente, y en general, los dispositivos de destino compatibles incluyen cualquier dispositivo que pueda decodificar el perfil de VP9 2 y exportarlo a una pantalla HDR.

  • Chromecast Ultra + TV compatible con HDR
  • La actualización de Chrome 64 Canary en Windows 10 para creadores de otoño con la marca HDR activada. (Esta es una buena herramienta de depuración).
  • Cualquier TV HDR con VP9 Perfil 2
    • Todos los modelos de HDR de Samsung 2017 (lista flatpanelshd.com) y de 2016 a partir de &KS;
    • Todos los modelos LG de 2017 HDR (también algunos modelos de LG G6 de 2016)
    • En dispositivos móviles, dispositivos compatibles con decodificación HDR de 10 bits perfil 2 de VP9 de hardware (Meizu Pro 7)
    • UHD Bluray de 2017

Configuración de la línea de comandos de FFmpeg para habilitar el EvF de perfil de VP9 y HDR

Tu FFmpeg se debe compilar con compatibilidad de 10 bits (o incluso 12 bits).

En los ejemplos que aparecen a continuación, usamos un ffmpeg compilado de manera estática con compatibilidad de 10 bits. Puedes usar nuestra secuencia de comandos de compilación para personalizarla o seguir las instrucciones del sitio de FFmpeg.

A continuación, se muestra una línea de comandos FFmpeg utilizable para la codificación HDR a los estándares 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

Desglose de los parámetros clave que se presentan aquí:

ffmpeg La compilación estática es compatible con 10 bits.
-pass 1 El HDR requiere codificación de 2 pase. En este ejemplo, el primer pase se envía a /dev/null y se procesa en la memoria durante el segundo pase.
-pix_fmt yuv420p10le Configura el formato de píxeles de YUV 4:2:0 de 10 bits.
-color_primaries 9 Conjuntos BT2020 Consulta las páginas 5 y 6 de este documento para obtener más información.
-color_trc 16 16 establece Características de transferencia en SMPTE 2084. PQ 18 establece las características de transferencia SMPTE 2086 HLG
-colorspace 9 colorspace es el "matrix_coeficientes." Deben ser coherentes con la forma en que se masterizó el contenido. (p.ej., bt709, bt2020_ncl). En este ejemplo, debería ser 9 para bt2020_ncl. Para obtener más información, consulta la página 12 de este documento
-color_range 1 Rango de colores (0 = sin especificar, 1 = mpeg/studio/tv, 2 = jpeg/full/pc)
-profile:v 2 Para HDR, se requiere un perfil o 2 o 3.
-vcodec libvpx-vp9 Usa el codificador VP9.

Ejemplos de códigos

Todos los ejemplos siguientes usan el archivo de origen strobe_cient.mkv.

Como nota general, sobre las tasas de bits con codificación HDR, se recomienda una tasa de bits entre un 25 y un 30% más alta que la codificación SDR equivalente de 8 bits. Por lo general, los ejemplos se orientan a 18 Mbps. Se pueden lograr buenos resultados de HDR con tasas de bits de 12 Mbps con un ajuste óptimo.

Las codificaciones se realizaron en un sistema Linux Linux con las siguientes especificaciones:

  • Procesador: Intel(4) Core(TM) i5-6500 de CPU de 4 GHz a 3.20 GHz
  • Memoria (RAM): 8,060 MB (usado de 1,492 MB)
  • Gráficos: Intel HD Graphics 530 (Skylake GT2)
  • SO: Ubuntu 16.04 LTS

Convertir en YQ 4:2:0 10 bits PQ

Ejemplo A: 6 pases de 6 Mbps de 4 Mb
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
Ejemplo B1: 18 Mbps, 2k de 4k
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
Ejemplo B2: 18 Mbps, 1080p y 2 pase
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

Convierte HDR en SDR con una tabla de búsqueda (LUT)

La conversión de HDR a SDR requiere que el transcodificador entienda cómo asignar los niveles de brillo y los colores al espacio de color BT.709 más pequeño y al rango de brillo que no sea HDR. Para obtener mejores resultados, se puede usar una LUT que describa cómo realizar esa asignación (que suele ser específica para el contenido). Los ejemplos C y D muestran cómo usar una LUT. Usamos bt2020_to_bt709_example.cube

Ejemplo C: 18 Mbps con resolución 4K HDR y 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

Convierte HLG en VP9 HLG10 con PQ de 10 bits

Requiere una fuente HLG. Usamos el archivo de entrada strobe_cient_hlg.mkv

Ejemplo D: 18 Mbps de HLG de 4K y 4-Pass
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

Resumen

Los archivos de salida tienen diferentes tamaños. La entrada era de 4.3 GB.

Ejemplo Resultado de destino Tamaño en disco Tiempo de codificación
A 6 Mbps de 4K con HDR sin ajustar 51.2MB 142 min
B1 18 Mbps con resolución 4K HDR 161MB 213m
B2 18 Mbps con HDR a 1080 píxeles 160MB 113m
C 18 Mbps HDR a SDR sin ajustar 165MB 124m
D Conversión de 18 Mbps de HLG 165MB 168m

Ten en cuenta que se recomienda esa codificación para el HDR, ya que esta puede variar en ciertas configuraciones.

Herramientas necesarias para señalizar HDR en resultados de WebM y MP4 (herramientas de línea de comandos de Matroska)

Al momento de escribir, FFmpeg no proporciona un mecanismo para especificar metadatos estáticos SMPTE 2086 en WebM/MKV, aunque lo propagará desde una transmisión de entrada cuando la transmisión lo contenga.

La herramienta mkvmerge, que forma parte de mkvtoolnix, se puede usar para insertar o modificar estos metadatos si la aplicación lo requiere.

A continuación, se muestra un ejemplo de cómo insertar metadatos de HDR en uno de los archivos creados con anterioridad. Es ideal para preparar contenido HDR a fin de subirlo a 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

En este ejemplo, se produce el archivo HDR_strobe_cient_18Mbps.mkv, en 0.6 segundos.