WebM: El Formato de Vídeo Web Libre de Royalties
WebM es un formato contenedor de vídeo abierto y libre de royalties desarrollado por Google y publicado en 2010 junto con VP8. Está basado en un subconjunto del contenedor Matroska (MKV) y está diseñado exclusivamente para entrega web. WebM soporta tres códecs de vídeo (VP8, VP9, AV1) y dos códecs de audio (Vorbis, Opus), todos sin royalties — siendo la alternativa completamente abierta a MP4/H.264.
Arquitectura del Contenedor
WebM está construido sobre el formato EBML (Lenguaje de Meta Binario Extensible), que usa la misma codificación de ID y tamaño de longitud variable que Matroska. La estructura de nivel superior de un archivo WebM:
Cabecera EBML
EBMLVersion: 1
DocType: "webm"
DocTypeVersion: 2 (VP8) o 4 (VP9/AV1)
Segmento
SeekHead — índice de posiciones de elementos de nivel superior
Info — duración, TimestampScale, MuxingApp, WritingApp
Tracks — descripciones de pistas (vídeo, audio)
Cues — tabla de puntos de búsqueda
Cluster — bloques temporalizados de datos codificados
Timestamp — marca temporal base del cluster
SimpleBlock — datos de frame de audio o vídeo
BlockGroup — bloque + datos adicionales de bloque
El elemento Segment envuelve todo el contenido. Los Clusters contienen los frames codificados reales. Cada SimpleBlock lleva el número de pista, una marca temporal relativa, flags (keyframe, invisible, lacing) y los datos del frame codificado. El elemento Cues proporciona una tabla de búsqueda que mapea marcas temporales a offsets de bytes de cluster.
Códecs de Vídeo: VP8, VP9, AV1
VP8
VP8 fue el códec de lanzamiento de WebM en 2010. Comparte similitudes arquitectónicas con H.264 pero usa codificación de entropía más simple (codificador aritmético booleano). VP8 ahora está ampliamente superado por VP9 pero sigue siendo útil para: dispositivos con decodificación hardware VP8 (muchos Android), WebRTC (VP8 es un códec WebRTC obligatorio) y compatibilidad con navegadores heredados.
VP9
VP9 (2013) mejora sobre VP8 con:
- Superblocks más grandes: 64×64 vs 16×16 de VP8
- Tamaños de partición asimétricos: 4×4 a 64×64 en configuraciones en L y rectangulares
- Tamaños de transformada: 4×4, 8×8, 16×16, 32×32
- Soporte de color de 10/12 bits (Perfiles 2/3): permite contenido HDR
- Ahorro de tasa de bits: aproximadamente 40–50% mejor que VP8 a la misma calidad
AV1
AV1 (2018) de la Alliance for Open Media ofrece:
- ~30% mejor compresión que VP9 a la misma calidad
- 77 modos de predicción intra, warped motion compensation, OBMC
- Filtros de bucle: deblocking, CDEF, restauración de bucle
- Síntesis de grano de película
- Soporte HDR de 10/12 bits
- La codificación es ~10× más lenta que VP9 pero el hardware de decodificación crece rápidamente
Codificación WebM con FFmpeg
# VP9 + Opus (recomendado para la mayoría de usos web)
# Dos pasadas para mejor calidad a tasa de bits objetivo
ffmpeg -i entrada.mp4 -c:v libvpx-vp9 -b:v 0 -crf 33 \
-pass 1 -an -f null /dev/null
ffmpeg -i entrada.mp4 -c:v libvpx-vp9 -b:v 0 -crf 33 \
-pass 2 -c:a libopus -b:a 128k \
-row-mt 1 -threads 4 \
salida.webm
# VP9 calidad constante (una pasada, tasa de bits variable)
ffmpeg -i entrada.mp4 \
-c:v libvpx-vp9 -crf 33 -b:v 0 \
-c:a libopus -b:a 128k \
salida.webm
# AV1 con SVT-AV1 (más rápido, calidad cercana a libaom)
ffmpeg -i entrada.mp4 \
-c:v libsvtav1 -crf 35 -preset 4 \
-c:a libopus -b:a 128k \
salida_av1.webm
# VP8 (heredado / interoperabilidad WebRTC)
ffmpeg -i entrada.mp4 \
-c:v libvpx -b:v 1M -crf 10 \
-c:a libvorbis -q:a 4 \
salida_vp8.webm
Escala CRF de VP9:
| CRF | Calidad aproximada | Caso de uso |
|---|---|---|
| 15–25 | Casi sin pérdida | Archivado |
| 28–35 | Alta calidad | VOD web |
| 36–45 | Aceptable | Streaming bajo ancho de banda |
| 46–63 | Baja calidad | Miniaturas/previsualizaciones |
Automatización con Python
import subprocess, json
def info_webm(ruta: str) -> dict:
"""Devuelve información del códec, resolución y duración de un archivo WebM."""
cmd = ['ffprobe', '-v', 'quiet', '-print_format', 'json',
'-show_streams', '-show_format', ruta]
datos = json.loads(subprocess.check_output(cmd))
video = next((s for s in datos['streams'] if s['codec_type'] == 'video'), {})
audio = next((s for s in datos['streams'] if s['codec_type'] == 'audio'), {})
return {
'codec_video': video.get('codec_name'),
'resolucion': f"{video.get('width')}x{video.get('height')}",
'duracion': float(datos['format'].get('duration', 0)),
'codec_audio': audio.get('codec_name'),
'bitrate_kbps': int(datos['format'].get('bit_rate', 0)) // 1000,
}
info = info_webm('muestra.webm')
print(info)
# {'codec_video': 'vp9', 'resolucion': '1920x1080', 'duracion': 120.5, ...}
WebM vs MP4 / H.264
| Característica | WebM | MP4/H.264 |
|---|---|---|
| Royalties | Ninguno | MPEG-LA con licencia |
| Soporte en navegadores | Chrome, Firefox, Edge, Opera | Todos (incluido Safari, iOS) |
| Decodificación hardware | Creciente | Universal |
| Velocidad de codificación | Más lenta (VP9/AV1) | Más rápida (H.264) |
| Compresión | Mejor (VP9/AV1) | Buena (H.264) |
| Streaming adaptativo | WebM DASH | MPEG-DASH / HLS |
| Soporte HDR | VP9/AV1 | H.265 (no H.264) |
Recomendación práctica: Usa WebM/VP9 como complemento a MP4/H.264 en un elemento HTML <video> con fallback:
<video controls width="1280" height="720">
<source src="video.webm" type="video/webm">
<source src="video.mp4" type="video/mp4">
Tu navegador no soporta el elemento de vídeo.
</video>
Chrome y Firefox prefieren WebM; Safari recurre al MP4.
Errores Comunes
- Safari no soporta WebM. A fecha de 2025, Safari en macOS/iOS no incluye decodificadores VP8/VP9 (aunque el soporte AV1 apareció en Safari 17 para algunos formatos). Proporciona siempre un fallback MP4.
- La codificación VP9 es significativamente más lenta que H.264. Activa
-row-mt 1y-threads Npara usar múltiples núcleos CPU. - b:v 0 es necesario para el modo CRF en libvpx-vp9. A diferencia de libx264 donde
-crfsolo activa el modo de calidad, VP9 requiere establecer explícitamente el objetivo de tasa de bits a 0 (-b:v 0). - El elemento Cues debe estar al principio para streaming web. Algunos muxers escriben Cues al final del archivo. Usa las opciones específicas de WebM de FFmpeg o remúltiple con
mkvmergesi el seeking es lento.
Conversiones relacionadas
Conversiones de vídeo que encajan con esta guía: