MP4: El Contenedor de Vídeo Universal — Análisis Técnico Profundo
MP4 es el formato de vídeo con el que interactúas cada día — descargado de YouTube, grabado con tu teléfono, compartido en redes sociales, transmitido en Netflix. A pesar de su ubicuidad, MP4 es profundamente malentendido: la mayoría lo trata como un códec de vídeo, pero en realidad es un formato contenedor.
MP4 No Es un Códec
Esto es lo más importante: MP4 es un contenedor, no un códec. Un fichero MP4 es como un contenedor de envío que puede contener diferentes cargas:
- Códec de vídeo: H.264 (AVC), H.265 (HEVC), AV1, VP9
- Códec de audio: AAC, MP3, Opus, AC-3 (Dolby), ALAC (Apple sin pérdida)
- Subtítulos: TTXT (texto), WebVTT, SRT
- Metadatos: título, portada, capítulos
El códec determina la calidad de compresión y la compatibilidad. El contenedor proporciona el empaquetado que permite a los reproductores encontrar las pistas de audio y vídeo, sincronizarlas y buscar eficientemente en cualquier punto.
MP4 e ISOBMFF
MP4 (MPEG-4 Parte 14, ISO/IEC 14496-14) es un perfil de ISOBMFF (ISO Base Media File Format). ISOBMFF es también la base de HEIF/HEIC, QuickTime (.mov), AVIF y el MP4 Fragmentado para streaming.
Arquitectura Box/Atom
Un fichero MP4 es una jerarquía de cajas (también llamadas átomos). Cada caja tiene un tamaño de 4 bytes y un tipo de 4 bytes (cuatro caracteres ASCII):
Fichero MP4 (serie de cajas de nivel superior)
├── ftyp — Caja de Tipo de Fichero
│ ├── marca_principal: 'isom' / 'mp42' / 'M4V ' / 'M4A '
│ └── marcas_compatibles: ['isom', 'mp41', 'avc1']
│
├── moov — Contenedor de Película (TODOS los metadatos)
│ ├── mvhd — Cabecera de Película (duración, escala de tiempo, velocidad, volumen)
│ ├── trak — Contenedor de Pista (una por flujo: vídeo, audio, subtítulos)
│ │ ├── tkhd — Cabecera de Pista
│ │ └── mdia — Contenedor de Medios
│ │ ├── mdhd — Cabecera de Medios (escala de tiempo, idioma)
│ │ ├── hdlr — Referencia de Manejador ('vide', 'soun', 'text')
│ │ └── minf — Contenedor de Información de Medios
│ │ └── stbl — Tabla de Muestras (el índice de todos los fotogramas)
│ │ ├── stsd — Descripción de Muestra (info del códec)
│ │ ├── stts — Tabla de Tiempo a Muestra
│ │ ├── stss — Tabla de Muestra de Sincronización (posiciones de keyframe)
│ │ ├── stsz — Tabla de Tamaño de Muestra
│ │ └── stco — Tabla de Desplazamiento de Chunk
│ └── udta — Datos de Usuario (metadatos: título, artista, portada, capítulos)
│
└── mdat — Datos de Medios (los bytes reales de vídeo/audio)
El Problema moov-al-frente (Fast Start)
Por defecto, muchos codificadores escriben mdat primero, luego moov al final del fichero. Esto significa que un reproductor web no puede comenzar la reproducción hasta que el fichero completo se haya descargado.
MP4 optimizado para web mueve moov al frente. Esto se llama Fast Start o Descarga Progresiva:
# Mover moov al frente (Fast Start)
ffmpeg -i entrada.mov -c copy -movflags +faststart salida.mp4
# Verificar: moov debe aparecer antes de mdat en la salida
ffprobe -v trace -i salida.mp4 2>&1 | grep -E "^(ftyp|free|moov|mdat)"
MP4 Fragmentado (fMP4) para Streaming
Para la transmisión adaptativa de tasa de bits (DASH, HLS), el vídeo se divide en segmentos (típicamente 2–10 segundos cada uno). El MP4 Fragmentado extiende ISOBMFF con fragmentos de película:
Estructura fMP4
├── ftyp
├── moov (segmento de inicialización — sin mdat)
│ └── mvex → trex
├── moof + mdat — Fragmento de Película 1 (segmento 1)
│ └── moof (Cabecera de Fragmento de Película)
│ ├── mfhd (número de secuencia)
│ └── traf (Fragmento de Pista)
│ ├── tfhd, tfdt, trun
└── moof + mdat — Fragmento de Película 2, 3, ...
Trabajar con MP4 Usando FFmpeg
# Codificar a H.264 + AAC en MP4 (compatibilidad universal)
ffmpeg -i entrada.mov \
-c:v libx264 -crf 23 -preset medium -profile:v high \
-c:a aac -b:a 192k \
-movflags +faststart \
salida.mp4
# Codificar a H.265 (HEVC) — 40-50% más pequeño que H.264 a la misma calidad
ffmpeg -i entrada.mov \
-c:v libx265 -crf 28 -preset slow \
-c:a aac -b:a 192k \
-movflags +faststart \
salida_hevc.mp4
# Codificar a AV1 (libre de royalties, mejor compresión)
ffmpeg -i entrada.mov \
-c:v libaom-av1 -crf 32 -b:v 0 -cpu-used 4 \
-c:a libopus -b:a 128k \
salida.mp4
# Extraer flujo de vídeo sin recodificar (copia)
ffmpeg -i entrada.mp4 -c:v copy -an solo_video.mp4
# Extraer audio sin recodificar
ffmpeg -i entrada.mp4 -c:a copy -vn audio.m4a
# Inspeccionar estructura MP4
ffprobe -v quiet -print_format json -show_format -show_streams entrada.mp4
Python: Análisis de la Estructura de Cajas MP4
import struct
def analizar_cajas_mp4(ruta_fichero):
"""Analizar cajas MP4 de nivel superior de un fichero."""
cajas = []
with open(ruta_fichero, 'rb') as f:
tamano_fichero = f.seek(0, 2)
f.seek(0)
desplazamiento = 0
while desplazamiento < tamano_fichero:
cabecera = f.read(8)
if len(cabecera) < 8:
break
tamano, tipo_caja = struct.unpack('>I4s', cabecera)
tipo_caja = tipo_caja.decode('ascii', errors='replace')
if tamano == 0:
siguiente = tamano_fichero
else:
siguiente = desplazamiento + tamano
cajas.append({'desplazamiento': desplazamiento, 'tamano': tamano, 'tipo': tipo_caja})
f.seek(siguiente)
desplazamiento = siguiente
return cajas
for caja in analizar_cajas_mp4('video.mp4'):
print(f"0x{caja['desplazamiento']:08x}: {caja['tipo']:4s} ({caja['tamano']:,} bytes)")
Combinaciones Comunes de Códec MP4
| Caso de uso | Vídeo | Audio | Nota del contenedor |
|---|---|---|---|
| Web universal | H.264 Baseline/High | AAC-LC | Máxima compatibilidad |
| Alta calidad web | H.265 / AV1 | AAC u Opus | Usar respaldo <source> |
| Dispositivos Apple | H.264 o H.265 | AAC o ALAC | .mp4 o .m4v |
| Subida a YouTube | H.264 + AAC a 256 kb/s | AAC | YouTube recodifica de todas formas |
| Edición profesional | ProRes / DNxHD | PCM o AAC | Contenedor MOV o MXF |
Resumen
MP4 es un contenedor, no un códec — entender esta distinción previene innumerables malentendidos técnicos. Su arquitectura de cajas ISOBMFF proporciona un marco flexible y extensible que soporta descarga progresiva, streaming adaptativo, múltiples pistas y metadatos ricos. La optimización moov-antes-de-mdat (fast start) es obligatoria para cualquier MP4 servido a través de la web.
Conversiones relacionadas
Conversiones de vídeo que encajan con esta guía: