Durante la construcción de Mux.js, eltransmuxor que constituye el núcleo de videojs-contrib-hls,nos enfrentamos a un problema: ¿cómo determinar si la salida de Mux.js es correcta?
Al principio, logramos averiguar cómo engatusar a FFmpeg para que creara MP4 a partir de segmentos MPEG2-TS que se reprodujeran en un navegador con Media Source Extensions (MSE), lo que en aquel momento significaba sólo Chrome. Sin embargo, necesitábamos una forma sencilla de comparar la salida de nuestro transmuxer con la producida por FFmpeg. La comparación tenía que tener en cuenta el formato MP4, ya que es muy poco probable que las dos salidas sean idénticas en bytes.
CONSTRUIR UN INSPECTOR MP4
La respuesta a ese problema era crear un inspector de mp4, una herramienta que analizara los MP4 y mostrara una especie de volcado tipo JSON de los cuadros relevantes y su contenido. Al generar un volcado de la salida de Mux.js y compararlo con un fragmento de calidad conocida generado con FFmpeg, pudimos ver en qué difería la salida de nuestro transmuxer.
El inspector mp4 fue construido como una página web para que podamos tener un gráfico de color codificado diff de los dos segmentos. Con el tiempo, la página adquirió un elemento de vídeo y empezamos a añadir los resultados de los segmentos transmuxing directamente en MediaSource del elemento de vídeo para ayudar en la retroalimentación instantánea y la validación de los cambios a Mux.js.
A medida que el desarrollo continuaba, a veces nos encontrábamos con flujos que fallaban de formas nuevas e interesantes. Algunos de estos fallos eran, ciertamente, debidos a errores en Mux.js. A medida que Mux.js se hacía más robusto, los fallos se debían cada vez más a problemas con los flujos o con una implementación concreta de la especificación MSE.
Al final nos dimos cuenta de que necesitábamos saber más sobre lo que ocurría dentro de esos vídeos. No sólo necesitábamos ver lo que ocurría en el contenedor multimedia, sino que teníamos que ir más allá, echar un vistazo a los propios datos del vídeo. Para ello creamos Thumbcoil.
Thumbcoil es un conjunto de herramientas diseñadas para que puedas echar un vistazo a la estructura interna de las secuencias de bits de vídeo H.264 contenidas en un archivo contenedor MP4 o MPEG2-TS. Con las herramientas de Thumbcoil puedes obtener una visión detallada de la estructura interna de los dos formatos contenedores de medios compatibles.
Además, las herramientas son capaces de mostrarte la información contenida en las unidades NAL más importantes que componen el flujo de bits H.264. ¿Te has preguntado alguna vez qué tipo de información secreta ha escondido el codificador de vídeo para que la utilicen los descodificadores? Con Thumbcoil, puedes verlo por ti mismo.
POR QUÉ HEMOS CREADO UN INSPECTOR MP4
En 2016, había muy pocas herramientas buenas para generar una visualización algo gráfica de la estructura de los contenedores multimedia y los datos que contienen. La depuración de problemas con la reproducción de vídeo suele ser una tarea tediosa que implica varios conjuros esotéricos de FFmpeg y FFprobe. Desafortunadamente, en el mejor de los casos, FFprobe sólo es capaz de imprimir una pequeña parte de los datos que nos interesan.
Los datos exactos dentro de los diversos conjuntos de parámetros, por ejemplo, no están disponibles a través de la línea de comandos. Dentro de FFprobe, esos datos son analizados y almacenados, pero no hay una manera fácil de volcar esa información en una forma legible por humanos.
En H.264, existen dos tipos especiales de unidades NAL: las unidades seq\_parameter\_set
(SPS) y el pic\_parameter\_set
(PPS). Estas dos unidades NAL contienen mucha información. Los descodificadores necesitan esta información para reconstruir el vídeo.
Thumbcoil no sólo proporciona información sobre el conjunto de parámetros con todo lujo de detalles, sino que además guarda la información con el contexto que la rodea: las cajas que contenía o el marco con el que se especificó. Este contexto suele ser muy importante para comprender los problemas o peculiaridades de los flujos.
CÓMO CONSTRUIMOS UN INSPECTOR MP4
Una de las cosas más interesantes acerca de cómo Thumbcoil analiza los conjuntos de parámetros es que construye lo que internamente se llama un "codec" para cada tipo de unidad NAL. Estos códecs se especifican utilizando lo que es esencialmente una configuración de tipo combinador analizador de fantasía.
Gran parte de los datos de los dos conjuntos de parámetros se almacenan mediante un método denominado codificación exponencial-golomb. Este método utiliza un número variable de bits para almacenar números y es especialmente adecuado para valores que tienden a ser pequeños.
Cada función utilizada para construir el códec devuelve un objeto con dos funciones: decodificar y codificar. Esto significa que podemos especificar el formato de, por ejemplo, un archivo seq\_parameter\_set
NAL una sola vez y entonces podremos parsear desde y escribir en el bitstream para esa unidad NAL en particular.
La gramática utilizada para especificar los códecs de unidades NAL es muy similar a la utilizada por la especificación H.264 (ISO/IEC 14496-10). Los tipos de datos que comprenden los códecs de Thumbcoil son, con algunas extensiones, simplemente los mismos tipos definidos en la especificación, como los enteros codificados con golomb exponencial con y sin signo.
Además de los conjuntos de parámetros, Thumbcoil proporciona información sobre la estructura de las propias capas de cortes analizando el archivo slice\_header
datos. Sin embargo, no analizamos ninguno de los datos reales. slice\_data
porque las cosas se vuelven rápidamente más difíciles y menos útiles a medida que se desciende a ese detalle.
Como todos los proyectos Video.js, Thumbcoil es un software de código abierto y aceptamos sugerencias, problemas y contribuciones en Github.
GLOSARIO TÉCNICO
- Transmuxor. Un transmuxer toma medios contenidos en algún formato de archivo, extrae el vídeo y el audio comprimidos en bruto de su interior (un proceso denominado demuxing) y vuelve a empaquetar los datos comprimidos en otro formato (lo que se denomina remuxing) sin realizar ninguna recompresión.
- MP4. Los archivos MP4 se componen de cajas, unidades lógicas jerárquicas que, convenientemente, comienzan con una longitud de 32 bits y un tipo de caja de 32 bits. Las cajas suelen contener otras subcajas.
- Contenedor multimedia. Dentro de un contenedor multimedia como MP4, el vídeo y el audio están contenidos en datos denominados flujos de bits. Las secuencias de bits son los datos producidos por los codificadores para representar las señales de audio o los fotogramas de vídeo. Algunas secuencias de bits comunes son AAC para audio y H.264 (AVC) para vídeo.
- Unidades NAL. Un flujo de bits codificado en H.264 se compone de lo que se denominan unidades NAL (Network Abstraction Layer). Las NAL son un formato de paquete sencillo diseñado para utilizar los bits de la forma más eficiente posible.