¿Qué es el video de 8 bits?
El video de 8 bits almacena cada componente de color de cada muestra como un entero de 8 bits, lo que proporciona 256 valores de código posibles por componente. Es la única profundidad de bits de VP8 y de los perfiles Constrained Baseline, Main y High de H.264, mientras que ITU-R BT.2100 especifica sus señales HDR con valores enteros a 10 o 12 bits.
Cómo funciona el video de 8 bits
La profundidad de bits es el número de bits utilizados para cuantizar cada componente de una muestra. Ocho bits proporcionan 256 códigos, pero el rango de la señal determina cuáles representan la imagen. ITU-R BT.709, el estándar HDTV, sitúa el negro en el código 16 y el blanco máximo nominal en 235 para la luma y R′G′B′, centra los componentes de diferencia de color en 128 dentro del intervalo de 16 a 240 y reserva 0 y 255 para referencias de sincronización; el video de rango completo utiliza en cambio de 0 a 255. El encoding de 10 bits del mismo estándar va de 64 a 940, con cuatro incrementos por cada incremento de 8 bits, y ese espaciado más amplio de 8 bits explica por qué los degradados pueden mostrar bandas visibles por debajo de 10 bits por componente. El submuestreo de crominancia y el rango se eligen por separado de la profundidad de bits: un formato de píxel designa una combinación de profundidad de bits y disposición de crominancia, un perfil de códec limita qué combinaciones puede usar un flujo y el rango normalmente se indica mediante una etiqueta independiente. HDR es la excepción a esa libertad: BT.2100 define señales PQ y HLG con valores enteros únicamente a 10 o 12 bits.
Datos clave
- Que un código de 8 bits signifique negro, blanco o ninguno de los dos depende del rango de la señal. En el rango limitado (TV o MPEG), el negro de luma es 16 y el blanco nominal es 235, con valores de diferencia de color de 16 a 240; en el rango completo (PC o JPEG), la escala va de 0 a 255. El video de rango limitado interpretado como rango completo pierde contraste, porque el negro y el blanco se sitúan en 16 y 235 en lugar de 0 y 255, por lo que debes mantener la etiqueta de rango coherente con las muestras durante cada conversión y actualizarla siempre que una conversión cambie el rango. YouTube, por ejemplo, convierte las subidas de rango completo a rango limitado.
- Un perfil de códec limita qué profundidades de bits y formatos de crominancia puede usar un flujo. Los perfiles Constrained Baseline, Main y High de H.264, HEVC Main, VP9 Profile 0 y VP8 están limitados a 8 bits con crominancia 4:2:0 (H.264 High también permite video monocromático), por lo que los dos códecs de video que todo navegador WebRTC debe implementar, VP8 y H.264 Constrained Baseline, solo admiten 8 bits. El formato 4:2:0 de 10 bits necesita un perfil superior, como H.264 High 10, HEVC Main 10 o VP9 Profile 2, y los formatos 4:2:2 o 4:4:4 de 8 bits necesitan perfiles como H.264 High 4:2:2, H.264 High 4:4:4 Predictive o VP9 Profile 1. H.264 High 10 y HEVC Main 10 también admiten video de 8 bits, por lo que el nombre de un perfil por sí solo no determina la profundidad de bits.
- La transcodificación no garantiza por sí sola una salida 4:2:0 de 8 bits. La guía de encoding H.264 de FFmpeg advierte que, según la fuente, la salida puede usar un formato de píxel que QuickTime y la mayoría de los demás reproductores no pueden reproducir, y recomienda solicitar
yuv420pexplícitamente. En la nomenclatura de FFmpeg,yuv420pes 4:2:0 de 8 bits yyuv420p10lees su equivalente de 10 bits, por lo que debes comprobar el formato de píxel tanto de la fuente como de la salida. Un formato de píxel no describe la función de transferencia, y FFmpeg documenta el mapeo de tonos entre rangos dinámicos como un filtro independiente,tonemap, por lo que solicitaryuv420pno convierte una fuente PQ o HLG en SDR. - Reducir material de mayor profundidad de bits a 8 bits puede introducir bandas en regiones casi uniformes, y el tramado no garantiza una solución. El filtro
zscalede FFmpeg ofrece tramado ordenado, aleatorio y por difusión de errores, pero no aplica ninguno de forma predeterminada, y FFmpeg documenta su filtro de eliminación de bandasgradfuncomo exclusivo para la reproducción, porque la compresión con pérdida tiende a eliminar el tramado y hacer que las bandas reaparezcan.
Cuándo importa el video de 8 bits
Elige una salida de 8 bits para entregas de rango dinámico estándar que deban reproducirse en la mayor variedad de navegadores y reproductores, y solicita el formato de píxel explícitamente, porque de lo contrario un codificador puede conservar un formato de origen de mayor profundidad de bits o 4:2:2. La profundidad de bits no es el rango dinámico: una fuente de 10 bits no es necesariamente HDR, y reducir una fuente HDR a un formato de píxel de 8 bits no la convierte por sí solo en SDR. Prevé al menos 10 bits junto con una función de transferencia PQ o HLG para la entrega HDR, e inspecciona primero las regiones casi uniformes y los degradados suaves al comprobar si un video con encoding de 8 bits presenta bandas.
Cómo ayuda Transloadit con el video de 8 bits
El Robot /video/encode de Transloadit pasa las opciones de su parámetro ffmpeg a FFmpeg, y esas opciones tienen prioridad sobre el ajuste preestablecido elegido, por lo que una Assembly puede solicitar explícitamente una salida 4:2:0 de 8 bits, por ejemplo, con pix_fmt establecido en yuv420p, en lugar de depender de la fuente o del ajuste preestablecido.
Las tablas de ajustes preestablecidos indican el contenedor, los códecs, las tasas de bits y la resolución, pero no el formato de píxel, por lo que debes inspeccionar un archivo codificado para confirmar su profundidad de bits.
Fuentes
- Recomendación ITU-R BT.709-6: valores de parámetros para los estándares HDTV (PDF)
- Recomendación ITU-R BT.2100-3: valores de parámetros de imagen para televisión de alto rango dinámico (PDF)
- MDN: guía de códecs de video para la web
- WebM Project: perfiles de encoding de VP9
- RFC 7742: requisitos de procesamiento de video y códecs para WebRTC
- Wiki de FFmpeg: guía de encoding de video H.264
- Documentación de filtros de FFmpeg (scale, zscale, gradfun, tonemap)
- Código fuente de FFmpeg n7.1: definiciones de formatos de píxel en libavutil/pixfmt.h
- Ayuda de YouTube: ajustes de encoding recomendados para subidas
- Ayuda de YouTube: sube videos de alto rango dinámico (HDR)