Un MP4 es una caja de cajas
Un archivo MP4 está construido a partir de cajas(«boxes»). (El nombre más antiguo que les da la especificación,átomos, es el que ha cuajado en los mensajes de error.) Toda caja empieza con la misma cabecera de 8 bytes: 4 bytes que indican el tamaño de la caja y luego 4 caracteres que indican de qué tipo de caja se trata. Esa es toda la gramática. Las cajas pueden contener otras cajas, y un analizador recorre el archivo leyendo una cabecera, decidiendo si mira dentro y saltando hacia delante, según el tamaño declarado, hasta la siguiente.
Abre cualquier grabación terminada (de un móvil, una GoPro, OBS, un dron) y en el nivel superior encontrarás las mismas tres cajas haciendo todo el trabajo:
Declara «esto es un MP4» y qué variante del formato deben esperar los reproductores. Lo primero que hay en el archivo.
Los fotogramas de audio y vídeo comprimidos, empaquetados uno tras otro en el orden en que se grabaron. Sin etiquetas, sin marcas de tiempo, sin límites de fotograma visibles desde fuera, solo carga útil.
El mapa de todo lo anterior: dónde empieza cada fotograma, cuánto ocupa, cuándo se reproduce. Cajas dentro de cajas:
Los archivos MOV, el formato de QuickTime del que deriva el MP4, comparten esta misma estructura, y por eso un MOV que no abre y un MP4 que no abre son casi siempre el mismo problema con distinta extensión.
El átomo moov es el mapa
Aquí está la parte que sorprende a la gente: el bloque de datos esopaco. Los fotogramas comprimidos se sitúan uno tras otro enmdat sin nada que los separe, sin marcas que digan «el fotograma 412 empieza aquí». Cada pregunta que un reproductor necesita responder vive, en cambio, en el átomo moov, en un conjunto de estructuras llamadas tablas de muestras:
- ¿Dónde está cada fotograma? La tabla de desplazamiento de fragmentos (
stco) registra las posiciones en bytes dentro del archivo. - ¿Cuánto ocupa cada fotograma? La tabla de tamaños de muestra (
stsz) enumera la longitud de cada fotograma, una entrada por fotograma. - ¿Cuándo se reproduce cada fotograma? La tabla de tiempo por muestra (
stts) hace corresponder los fotogramas con el reloj de la película, para que el audio y el vídeo vayan sincronizados al milímetro. - ¿A qué puntos puede saltar la reproducción? La tabla de muestras de sincronización (
stss) enumera los fotogramas clave, los únicos desde los que un decodificador puede arrancar, que es lo que hace posible el avance rápido.
Hasta la configuración del decodificador (los parámetros que le dicen cómo se comprimió el vídeo) se guarda en el átomo moov, no en el flujo. A un reproductor sin el átomo moov no le faltan solo las marcas de capítulo; no sabe dónde empieza un solo fotograma, cuánto dura el vídeo ni cómo configurar su decodificador. Piensa en una biblioteca donde los libros están colocados sin lomos, sin títulos y sin catálogo: la información existe entera, y nada de ella es accesible. Eso es mdat sinmoov, y por eso los reproductores se rinden por completo en lugar de reproducir «la mayor parte» de un archivo dañado.
Por qué el índice se escribe al final
El átomo moov describe cada fotograma: su posición, su tamaño, sus tiempos. Mientras grabas, nada de eso se puede saber: la cámara no tiene ni idea de si vas a parar en diez segundos o en dos horas, y el desplazamiento en bytes de un fotograma no se puede registrar antes de que el fotograma exista. Así que todo grabador hace lo único que puede. Va volcando los fotogramas comprimidos en mdat a medida que se codifican, mantiene las cuentas en curso en memoria y escribe el índice de una sola pasada en el momento en que pulsas «detener».
Durante la grabación: los fotogramas se van añadiendo a medida que se codifican. El índice aún no puede existir; su contenido no se conoce hasta que se escribe el último fotograma.
Finalización: el grabador mide todo lo que ha escrito y añade el átomo moov. Solo ahora el archivo se puede reproducir.
Este diseño es eficiente y seguro, justo hasta que la grabación no llega al paso de finalización. Una batería agotada, un bloqueo de OBS, un dron en un lago: el proceso que escribe el archivo se detiene y el índice nunca se escribe. Lo que queda en el disco es un archivo con un tamaño saludable, horas de imágenes intactas en mdat y ningún mapa. Todos los reproductores lo rechazan; ffmpeg muestra moov atom not found. Las imágenes no han desaparecido; están varadas. (Los últimos segundos, aún en el búfer de memoria de la cámara y todavía sin volcar al almacenamiento, sí han desaparecido. Las herramientas honestas lo dicen.) Ese estado de «varado pero intacto» es justo para lo que existe lareparación del átomo moov, y es el modo de fallo típico de las grabaciones de OBS que se bloquean.
faststart y MP4 fragmentado
El diseño de índice al final tiene dos consecuencias bien conocidas, y la industria construyó una solución para cada una.
faststart: mover el índice al principio, a posteriori
Un navegador que reproduce en streaming un vídeo desde la web lee el archivo de principio a fin. Si el átomo moov está al final, la reproducción no puede empezar hasta que se ha descargado el archivo entero; el reproductor tiene el libro en la mano y espera el catálogo. La solución es una pasada de posprocesado (el -movflags +faststart de ffmpeg) que reescribe el archivo terminado con el átomo moov movido al principio:
Un archivo «faststart»: primero el índice, para que la reproducción en streaming pueda empezar de inmediato. Por eso algunos vídeos web arrancan al instante y otros se atascan.
Fíjate en lo que faststart no es: protección frente a bloqueos. Se ejecuta sobre un archivo completo y sano después de que termina la codificación. Una grabación que muere a mitad de escritura nunca llega a ese paso.
MP4 fragmentado: muchos índices pequeños en lugar de uno grande
La segunda consecuencia (si pierdes la finalización, pierdes el archivo) la resuelve el MP4 fragmentado. En lugar de unmdat y un moov al final, el archivo se escribe como una cadena de segmentos cortos autodescriptivos, cada uno una porción de datos con su propio miniíndice (una caja moof). En términos de ffmpeg,-movflags frag_keyframe+empty_moov: un moov esqueleto al principio y luego fragmento tras fragmento. Si el grabador muere, pierdes como mucho el último fragmento, y todo lo anterior ya está indexado y se puede reproducir. Los servicios de streaming entregan el vídeo así por la misma razón. El precio a pagar es la compatibilidad: algunos editores y reproductores antiguos manejan mal los archivos fragmentados, y por eso las cámaras siguen escribiendo la disposición clásica. La respuesta de OBS (en OBS 30.2 y posteriores) es el «MP4 híbrido», que conserva la resistencia a bloqueos del estilo fragmentado a la vez que finaliza en un archivo ampliamente compatible, algo que vale la pena activar si los bloqueos de OBS ya te han jugado una mala pasada antes.
Cómo funciona la reconstrucción del moov
Así que un bloqueo te ha dejado con ftyp, unmdat gigantesco y ningún índice. Reconstruirlo es posible porque el bloque de datos «opaco» no es del todo opaco para un analizador que conoce los códecs. Dentro de mdat, los fotogramas de vídeo se almacenan como unidades con prefijo de longitud, y el flujo de bits de cada códec tiene patrones reconocibles: cabeceras que marcan el tipo, las dimensiones y los límites de un fotograma. Las herramientas de reconstrucción (el proyecto de código abierto untrunc asentó el enfoque, y es la clase de reparación que realiza el motor de vídeo de IntactFile) recorren los datos en bruto byte a byte:
- Localizar los límites de los fotogramas. Escanear
mdat, usando los prefijos de longitud y las firmas del códec para identificar dónde empieza y termina cada fotograma de vídeo y de audio. - Clasificar y medir. Asignar cada fotograma a su flujo y registrar su tamaño y posición, reconstruyendo muestra a muestra la materia prima de
stszystco. - Reconstruir los tiempos. Deducir la duración de los fotogramas a partir de los ajustes del codificador. Por eso
untruncpide un archivo de referencia en buen estado grabado con los mismos ajustes, para aprender cómo es lo «normal» en tu dispositivo. - Escribir un moov nuevo y finalizar. Ensamblar las tablas de muestras en un índice nuevo y volcar un archivo correcto según la especificación.
El resultado reproduce todo lo que sobrevivió físicamente, terminando donde terminan los datos. Las limitaciones honestas se derivan directamente del mecanismo: las grabaciones con tiempos de fotograma muy irregulares pueden volver con un leve desfase entre audio y vídeo, y si el propio mdat son ceros (falló el almacenamiento, no el grabador) no hay fotogramas que encontrar, y ninguna herramienta puede conjurarlos. Para el panorama más amplio de qué daño es cuál, miracómo se corrompen los vídeos y qué tiene arreglo de verdad.
Preguntas frecuentes
¿Qué es el átomo moov en un archivo MP4?
El átomo moov es el índice del MP4: un bloque estructurado que registra dónde se sitúa en el archivo cada fotograma de vídeo y de audio, cuánto ocupa cada uno, cuándo debe mostrarse y cómo se sincronizan las pistas. También lleva la configuración del decodificador. El reproductor lee primero el átomo moov y lo usa como mapa hacia los datos multimedia. Sin un átomo moov válido, el archivo no abre, aunque las imágenes en sí estén intactas.
¿Por qué está el átomo moov al final del archivo?
Porque su contenido no se conoce hasta que la grabación termina. El átomo moov enumera el tamaño, la posición y los tiempos de cada fotograma, información que solo existe una vez escrito el último fotograma. Por eso los grabadores van añadiendo fotogramas sobre la marcha y escriben el índice de una sola pasada al finalizar, lo que lo deja después de los datos multimedia. Los archivos preparados para streaming web suelen tener el moov movido al principio a posteriori («faststart»), pero eso es un paso de posprocesado, no la forma en que nace el archivo.
¿Se puede reconstruir un átomo moov ausente?
Normalmente sí, siempre que los datos multimedia (el bloque mdat) hayan sobrevivido. Las herramientas de reconstrucción escanean el flujo en bruto, detectan los límites de cada fotograma, miden tamaños y posiciones y reconstruyen las tablas de muestras que habría contenido el átomo moov. El resultado es un archivo reproducible que abarca todo hasta el punto de la interrupción. Si el bloque mdat falta, está a ceros o ha sido sobrescrito, no hay nada que indexar, y ninguna herramienta puede reconstruir el archivo. Puedes comprobar un archivo en tu navegador para ver en cuál de los casos está el tuyo.
¿Cuál es la diferencia entre moov y mdat?
El mdat contiene la carga útil: los fotogramas de audio y vídeo comprimidos, empaquetados uno tras otro, normalmente el 99 % del tamaño del archivo. El moov contiene los metadatos: el índice que describe dónde empieza cada fotograma dentro del mdat, su tamaño, sus tiempos y los ajustes del decodificador necesarios para reproducirlo. Un mdat sin moov son imágenes sin mapa: los datos están ahí, pero ningún reproductor puede navegar por ellos. Un moov sin mdat es el mapa de un territorio que ya no existe.
¿Qué hace movflags faststart?
En ffmpeg, -movflags +faststart reubica el átomo moov del final de un archivo terminado al principio, justo después de la cabecera de tipo de archivo. Así los reproductores pueden empezar la reproducción mientras el resto del archivo aún se está descargando, y por eso es lo estándar para el vídeo web. Requiere reescribir el archivo (ffmpeg hace una segunda pasada) y solo funciona sobre un archivo sano y completo. No protege una grabación frente a bloqueos y no puede arreglar un archivo cuyo moov nunca llegó a escribirse.
También en esta serie: cómo se corrompen los vídeos y qué tiene arreglo de verdad.