Codificación HDR de VP9
El video de alto rango dinámico (HDR) es una tecnología en desarrollo. Actualmente, existen varios estándares que se armonizan de forma gradual.
Para obtener una imagen actualizada de la evolución del video HDR, consulta el artículo de Wikipedia Video de alto rango dinámico.
FFmpeg se puede usar junto con VP9 para (1) comprimir fuentes HDR en salidas de rango dinámico estándar (SDR) o (2) volver a empaquetar una fuente HDR en formatos HDR aptos para la Web.
Fuentes de entradas
Actualmente, cuando se codifica HDR con VP9, se pueden usar como entrada todos los códecs de alta profundidad de bits (10 bits) compatibles con FFmpeg (por ejemplo, VP9 Profile 2 y 3, H.264 (10 bits), DNxHR, HEVC, ProRes, etcétera). Consulta también el artículo de ayuda de YouTube Cómo subir videos de Alto rango dinámico (HDR).
Alcance de la salida codificada:
Actualmente y, en general, los dispositivos de destino compatibles incluyen cualquier dispositivo que pueda decodificar el perfil 2 de VP9 y generar contenido en una pantalla HDR.
- Chromecast Ultra y una TV compatible con HDR
- Chrome 64 Canary en Windows 10 Fall Creators Update, con la marca HDR activada. (Esta es una buena herramienta de depuración).
- Cualquier TV HDR con el perfil 2 de VP9
- Todos los modelos HDR de Samsung del 2017 (lista de flatpanelshd.com) y los modelos del 2016 que comienzan con "KS"
- Todos los modelos HDR de LG del 2017 (también algunos modelos LG G6 del 2016)
- En dispositivos móviles, los dispositivos que admiten la decodificación HDR de 10 bits del perfil 2 de VP9 acelerado por hardware (Meizu Pro 7)
- Blu-ray en UHD del 2017
Configuración de la línea de comandos de FFmpeg para habilitar el perfil 2 de VP9 y las EOTF de HDR
Tu FFmpeg deberá haberse compilado con compatibilidad de 10 bits (o incluso 12 bits).
En los siguientes ejemplos, usamos un ffmpeg
compilado de forma estática con compatibilidad de 10 bits.
Puedes usar nuestro script de compilación para crear el tuyo propio o seguir la guía del sitio de FFmpeg.
A continuación, se muestra una línea de comandos de FFmpeg utilizable para la codificación HDR según los estándares de 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
A continuación, se desglosan los parámetros clave que se presentaron aquí:
ffmpeg | Compilación estática con compatibilidad de 10 bits |
---|---|
-pass 1 |
El HDR requiere codificación de 2 pasos. En este ejemplo, el primer paso se genera en /dev/null y se procesa en la memoria durante el segundo paso. |
-pix_fmt yuv420p10le |
Establece el formato de píxel YUV 4:2:0 de 10 bits. |
-color_primaries 9 |
Establece BT2020 . Consulta las páginas 5 y 6 de este documento para obtener más detalles. |
-color_trc 16 |
16 establece las características de transferencia en SMPTE 2084. PQ 18 establece Transfer Characteristics SMPTE 2086 HLG |
-colorspace 9 |
colorspace son los "matrix_coefficients". Este parámetro debe configurarse de forma coherente 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 color (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. |
Ejemplo de codificaciones
En los siguientes ejemplos, se usa el archivo fuente strobe_scientist.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 Ubuntu Linux con las siguientes especificaciones:
- Procesador: 4x Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz
- Memoria (RAM): 8060 MB (1492 MB en uso)
- Gráficos: Intel HD Graphics 530 (Skylake GT2)
- SO: Ubuntu 16.04 LTS
Convertir a PQ YUV 4:2:0 de 10 bits
Ejemplo 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
- Archivo de salida: 2pass_HDR_strobe_scientist_6Mbps-static.webm
- Tiempo de codificación: 142 min y 30 s
- Tamaño del archivo en el disco: 51.2 MB
Ejemplo B1: 18 Mbps, 4K y 2 pasos
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
- Archivo de salida: 2pass_HDR_strobe_scientist_18Mbps-static.webm
- Tiempo de codificación: 213 min y 32 s
- Tamaño del archivo en el disco: 161 MB
Ejemplo B2: 18 Mbps, 1080p, 2 pasos
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
- Archivo de salida: 1080_2pass_HDR_strobe_scientist_18Mbps-static.webm
- Tiempo de codificación: 113 min y 9 s
- Tamaño del archivo en el disco: 160 MB
Cómo convertir HDR a SDR con una tabla de búsqueda (LUT)
Para convertir HDR a SDR, el transcodificador debe comprender 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 no HDR. Para obtener mejores resultados, se puede usar una LUT que describa cómo realizar esa asignación, que suele ser específica del contenido. En los ejemplos C y D, se muestra cómo usar una LUT. Usamos bt2020_to_bt709_example.cube.
Ejemplo C: HDR en 4K a 18 Mbps 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
- Archivo de salida: SDR_strobe_scientist_18Mbps-static.webm
- Tiempo de codificación: 124 min y 23 s
- Tamaño del archivo en el disco: 165 MB
Cómo convertir HLG a VP9 HLG10 PQ de 10 bits
Requiere una fuente HLG. Usamos el archivo de entrada strobe_scientist_hlg.mkv.
Ejemplo D: 18 Mbps 4K HLG de 2 pasos
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
- Archivo de salida: HLG_HDR_strobe_scientist_18Mbps-static.webm
- Tiempo de codificación: 186 min y 10 s
- Tamaño del archivo en el disco: 165 MB
Resumen
Los archivos de salida tienen tamaños diferentes. La entrada fue de 4.3 GB.
Ejemplo | Salida objetivo | Tamaño en disco | Tiempo de codificación |
---|---|---|---|
A | HDR sin escalar en 4K a 6 Mbps | 51.2 MB | 142 m |
B1 | HDR 4K sin escalar de 18 Mbps | 161 MB | 213 m |
B2 | HDR a 1080p con 18 Mbps | 160 MB | 113 min |
C | 18 Mbps HDR a SDR sin escalar | 165 MB | 124 m |
D | Conversión a HLG de 18 Mbps | 165 MB | 168 m |
Ten en cuenta que se recomienda la codificación de 2 pasos para HDR, ya que la de 1 paso puede variar en ciertas configuraciones.
Herramientas necesarias para indicar HDR en la salida de WebM y MP4 (herramientas de línea de comandos de Matroska)
En el momento de escribir este documento, FFmpeg no proporciona un mecanismo para especificar metadatos estáticos de SMPTE 2086 en WebM/MKV, aunque los propagará desde un flujo de entrada cuando el flujo los contenga.
La herramienta mkvmerge, que forma parte de mkvtoolnix, se puede usar para insertar o modificar estos metadatos si tu aplicación lo requiere.
A continuación, se muestra un ejemplo de cómo insertar metadatos HDR en uno de los archivos creados anteriormente. Es especialmente adecuado para preparar contenido HDR para 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_scientist_18Mbps.mkv en 0.6 segundos.