Saltar al contenido
AZ Tools

Inspector de archivos MP4 e ISO base media

Lee un archivo ISO base media caja por caja, en tu navegador y sin subir nada: .mp4, .m4a, .m4v y el .mov de QuickTime son el mismo contenedor con marcas distintas estampadas en el ftyp. Lo primero que responde es si el archivo tiene inicio rápido. La caja moov contiene el índice de todas las muestras del archivo; si va después de la mdat, un reproductor no puede empezar hasta que llega el último byte, y por eso un vídeo que se abre al instante desde el disco se queda parado un minuto cuando esos mismos bytes se sirven por HTTP. Debajo está el árbol de cajas con el tipo, el desplazamiento, el tamaño declarado y el peso de cada caja dentro del archivo, anidados, de modo que se ve de un vistazo si lo que ocupa espacio es el medio, una carátula desproporcionada o una caja free que dejó olvidada un editor. De cada pista informa del identificador, de si el manejador es vídeo, audio, subtítulos o hint, del códec tomado de la entrada de muestra y, cuando la caja de configuración está ahí para leerla, de la cadena RFC 6381 completa: avc1.42C01E desde avcC, mp4a.40.2 desde los descriptores de esds, vp09.00.30.08 desde vpcC. Las pistas de vídeo añaden el tamaño de imagen y las de audio la frecuencia de muestreo y el número de canales. Las duraciones se muestran como el recuento de ticks sobre la escala de tiempo que lo divide, porque una duración de 15360 no significa nada hasta saber si la escala es 600 o 15360, y porque la cabecera de película no es la última palabra: una pista puede durar más que ella, y un archivo fragmentado suele dejarla a cero y poner el total en mvex/mehd. Las fechas de creación y modificación se convierten desde la época de 1904 que ISO BMFF heredó de QuickTime, y aparecen como sin definir cuando el multiplexor las dejó a cero, que es lo habitual. Ningún tamaño declarado se da por bueno: una caja que reclama más bytes de los que contiene su padre se rechaza con un error con nombre en lugar de seguirla, un tamaño 0 se lee como "hasta el final", un tamaño 1 como un tamaño de 64 bits, y el tipo extendido de 16 bytes de una caja uuid se salta antes de la carga útil. Lo que no hace es decodificar: no puede decirte si la imagen sigue intacta más allá de las cabeceras, si el audio es silencio o qué tasa de bits consiguió el codificador, solo lo que el contenedor dice de sí mismo.

Cómo usar

  1. Suelta un .mp4, .m4a, .m4v o .mov sobre la caja. Solo se leen las cajas de cabecera, así que una película de varios gigabytes se abre igual de rápido que un clip corto.
  2. Mira primero la línea de inicio rápido. Si dice que no, el navegador tiene que descargar el archivo entero antes de reproducir un solo segundo: remultiplexa con la moov al principio antes de publicarlo.
  3. Comprueba la marca principal y las compatibles cuando un reproductor rechace el archivo: "qt " es una película QuickTime que solo declara compatibilidad con QuickTime, mientras que "isom" o "mp42" es lo que espera un reproductor web.
  4. Abre una pista para ver su códec, su propia escala de tiempo y duración, y el tamaño de imagen o la frecuencia de muestreo. Divide la duración entre la escala para obtener segundos; se muestran ambos para que la cuenta quede a la vista.
  5. Recorre el árbol de cajas buscando algo inesperadamente grande. En un archivo pequeño, una carátula o una caja free olvidada pueden ser una fracción sorprendente del total, y la columna de peso lo deja claro.

Preguntas frecuentes

¿Qué cambia realmente el inicio rápido y cómo arreglo un archivo que no lo tiene?
La caja moov es el índice: enumera el tamaño, la marca de tiempo y el desplazamiento de cada muestra del archivo. Un reproductor la necesita antes de decodificar nada, así que cuando la moov se escribe después de la mdat —lo que hace un multiplexor por defecto, porque la tabla de muestras solo está completa cuando se ha escrito el último fotograma— un navegador que reproduce por HTTP debe descargar el archivo entero, o lanzar peticiones de rango para buscar la moov, antes de mostrar el primer fotograma. Moverla al principio no cambia nada del medio: es una reordenación pura, que hacen ffmpeg con -movflags +faststart o cualquiera de las herramientas tipo qt-faststart. Los desplazamientos de fragmento de stco o co64 se desplazan todos al mover la moov, y por eso hay que reescribir el archivo en lugar de copiarlo.
¿Por qué la duración aparece como dos números divididos?
Los archivos ISO base media guardan el tiempo en ticks, y cada cabecera lleva su propia escala que dice cuántos ticks hacen un segundo. La cabecera de película suele usar 600 o 1000; una pista de vídeo usa a menudo algo divisible por la cadencia, como 15360 para 15 fps, y una pista de audio casi siempre la propia frecuencia de muestreo, 44100 o 48000. Una duración de 44032 no significa nada por sí sola: es un segundo de audio a 44,1 kHz, o 73 segundos con un reloj de película de 600 ticks. Enseñar la división y no solo el resultado también hace visible el redondeo: que la duración de una pista no sea un número entero de ticks de película es la razón habitual de que un archivo diga 5,98 segundos donde esperabas 6.
La fecha de creación dice 1904 o sin definir. ¿Está roto el archivo?
No. ISO BMFF heredó la época de QuickTime, que empieza a medianoche UTC del 1 de enero de 1904, y muchísimos multiplexores sencillamente no rellenan esos campos: ffmpeg escribe cero por defecto, y cero es la época misma. Así que un archivo que parece creado en 1904 lo creó en realidad una herramienta que prefirió no decirlo. Cuando los campos sí están rellenos, van en UTC sin ninguna información de zona, de modo que la marca no indica dónde se grabó, y es trivial de editar, así que por sí sola no prueba nada.
¿Por qué un archivo fragmentado parece no tener muestras?
Un MP4 fragmentado —lo que usan DASH, HLS en fMP4 y toda grabación que deba sobrevivir a un corte— guarda en la moov solo las definiciones de pista, con una caja mvex que anuncia "vendrán fragmentos", y describe las muestras reales en cajas moof repartidas por el archivo, cada una seguida de su propia mdat. Las tablas de muestras de la moov están vacías con toda legitimidad, y la duración de la película suele ser cero porque no se conocía al escribir la cabecera; el total, si alguien lo anotó, está en mvex/mehd. Esa es también la razón de que un archivo fragmentado se pueda cortar en cualquier punto y siga reproduciéndose hasta el corte, y de que un MP4 progresivo normal no.
MP4, M4A, M4V, MOV, 3GP: ¿por qué se abren todos aquí?
Son un mismo formato. ISO/IEC 14496-12 define la estructura de cajas, y la caja ftyp del principio declara una marca principal y una lista de marcas con las que el archivo es compatible. "M4A " significa que el archivo es solo de audio y de sabor Apple, "M4V" añade las convenciones de vídeo de Apple, "qt " es la disposición QuickTime original de la que desciende todo lo demás, "3gp4" es el perfil móvil, y "isom" o "mp42" es la genérica que busca un reproductor web. La extensión es una pista para el sistema operativo; la lista de marcas es la declaración de verdad, y no coinciden con la frecuencia suficiente como para que revisarla sea lo primero cuando un archivo no se reproduce.
¿Puede esta herramienta reparar un archivo o cambiar la posición de la moov?
No: solo lee, y además lee a propósito lo menos posible. Las cabeceras de las cajas se recorren troceando el archivo, así que la mdat nunca se carga en memoria y una película enorme se inspecciona tan deprisa como una pequeña. No se sube nada y no se reescribe nada. Si el árbol se corta con un error sobre una caja que reclama más bytes de los que tiene el archivo, lo normal es que el archivo se truncara en la transferencia o que la descarga se interrumpiera; lo que lo recupera es remultiplexar los fragmentos supervivientes, no editar la cabecera.

Herramientas relacionadas