Cómo comprimir video con FFmpeg
Optimizar el contenido de video para conseguir tiempos de carga rápidos es crucial en las aplicaciones web modernas. Los archivos de video grandes pueden afectar significativamente el rendimiento de un sitio web, lo que repercute en la experiencia de usuario y en el posicionamiento en los buscadores. FFmpeg, un potente framework multimedia de código abierto, ofrece herramientas robustas para comprimir videos manteniendo la calidad, lo que se traduce en tiempos de carga más rápidos y una mayor interacción de los usuarios.
Para obtener un MP4 compatible con un buen equilibrio entre calidad y tamaño, empieza con:
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -movflags +faststart -c:a aac -b:a 128k output.mp4
Aumenta el CRF para obtener un archivo más pequeño o redúcelo para lograr mayor calidad. Un ajuste preestablecido más lento suele mejorar la eficiencia de compresión, pero tarda más en codificar. Compara siempre el resultado con material de origen representativo antes de aplicar una misma configuración a toda una biblioteca.
Entender los códecs y formatos de video
Para el video web, elige los códecs según la compatibilidad y la eficiencia de compresión:
- H.264: ofrece compatibilidad universal y es ideal para uso general.
- H.265: ofrece una compresión aproximadamente un 30 % mejor que H.264 y es compatible con la mayoría de los dispositivos modernos.
- VP9: ofrece una alternativa gratuita a H.265 con amplia compatibilidad en navegadores.
- AV1: ofrece la mejor compresión y su compatibilidad sigue creciendo, lo que lo convierte en una opción preparada para el futuro.
Un códec codifica y decodifica datos de video digital. Los formatos contenedores (como MP4, MKV o WebM) empaquetan juntos el video, el audio y los metadatos. Para la entrega web, MP4 con H.264 es la opción más compatible, mientras que WebM con VP9 o AV1 puede ofrecer una compresión superior en los navegadores compatibles.
| Códec | Compresión | Compatibilidad con navegadores | Caso de uso |
|---|---|---|---|
| H.264 | Buena | Universal | Uso general |
| H.265 | ~30 % más eficiente | Parcial | Dispositivos modernos |
| VP9 | Eficiente | Amplia | Alternativa gratuita |
| AV1 | La mejor | Creciente | Preparado para el futuro |
Instalar FFmpeg en tu sistema
Los ejemplos usan opciones disponibles en las versiones actuales de FFmpeg. Comprueba
ffmpeg -version y los codificadores incluidos en tu compilación antes de elegir un
códec.
Linux (Ubuntu/Debian)
sudo apt update && sudo apt install ffmpeg
macOS
brew install ffmpeg
Windows
- Descarga la compilación más reciente desde gyan.dev.
- Extrae el archivo comprimido.
- Añade la carpeta
binal PATH de tu sistema.
Compresión básica de video con FFmpeg
Reducir el tamaño de los archivos de video
El siguiente comando ofrece un buen equilibrio entre calidad y compresión para el video web con H.264:
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -movflags +faststart -c:a aac -b:a 128k output.mp4
Valores de CRF recomendados por códec:
- H.264: 18-23 para alta calidad, 23-28 para uso general
- H.265: 24-30 (aproximadamente equivalente a H.264 con CRF 18-24)
- VP9: 15-35 (con una escala diferente)
- AV1: 25-35 para uso general
Opciones de códecs modernos
En los navegadores compatibles con códecs más recientes, puedes usar AV1 para mejorar la compresión:
ffmpeg -i input.mp4 -c:v libaom-av1 -crf 30 -b:v 0 -strict experimental -cpu-used 8 -row-mt 1 -c:a libopus -b:a 128k output.mkv
Técnicas de compresión avanzadas con FFmpeg
Codificación en dos pasadas
Para un control preciso de la tasa de bits, usa la codificación en dos pasadas:
# First pass
ffmpeg -y -i input.mp4 -c:v libx264 -b:v 1000k -pass 1 -an -f null /dev/null
# Second pass
ffmpeg -i input.mp4 -c:v libx264 -b:v 1000k -pass 2 -c:a aac -b:a 128k output.mp4
Codificación basada en la calidad
Para mantener una calidad visual constante, considera la codificación basada en la calidad:
# H.265 (HEVC)
ffmpeg -i input.mp4 -c:v libx265 -crf 28 -preset medium -tag:v hvc1 -c:a aac -b:a 128k output.mp4
# Vp9
ffmpeg -i input.mp4 -c:v libvpx-vp9 -b:v 0 -crf 30 -row-mt 1 -c:a libopus -b:a 128k output.webm
Compatibilidad con navegadores
| Códec | Chrome | Firefox | Safari | Edge |
|---|---|---|---|---|
| H.264 | ✅ | ✅ | ✅ | ✅ |
| H.265 | ⚠️ (parcial) | ❌ | ✅ | ⚠️ (parcial) |
| VP9 | ✅ | ✅ | ⚠️ (Safari v16+) | ✅ |
| AV1 | ✅ | ✅ | ⚠️ (Safari v17+) | ✅ |
Comparar la calidad y el tamaño de archivo
Usa las herramientas integradas de FFmpeg para evaluar tu resultado:
# Preview video
ffplay output.mp4
# Compare file sizes
ls -lh input.mp4 output.mp4
# Get detailed video information
ffprobe -v quiet -print_format json -show_format -show_streams output.mp4
Automatizar la compresión de video por lotes
Script de Bash
#!/bin/bash
input_dir="/path/to/videos"
output_dir="/path/to/output"
mkdir -p "$output_dir"
for file in "$input_dir"/*.mp4; do
filename=$(basename "$file")
ffmpeg -i "$file" \
-c:v libx264 \
-crf 23 \
-preset medium \
-movflags +faststart \
-c:a aac \
-b:a 128k \
"$output_dir/${filename%.*}_compressed.mp4"
done
Script de PowerShell
$inputDir = "C:\path\to\videos"
$outputDir = "C:\path\to\output"
New-Item -ItemType Directory -Force -Path $outputDir
Get-ChildItem -Path $inputDir -Filter *.mp4 | ForEach-Object {
$outputFile = Join-Path $outputDir ($_.BaseName + "_compressed.mp4")
ffmpeg -i $_.FullName `
-c:v libx264 `
-crf 23 `
-preset medium `
-movflags +faststart `
-c:a aac `
-b:a 128k `
$outputFile
}
Prácticas recomendadas
- Elige los códecs según tu público objetivo y tus requisitos de compatibilidad con navegadores.
- Prueba distintos valores de CRF para determinar el equilibrio óptimo entre calidad y tamaño de archivo.
- Usa la codificación en dos pasadas para obtener tamaños de archivo más predecibles.
- Activa
faststartpara mejorar el rendimiento de la reproducción web. - Considera generar varios formatos para garantizar la compatibilidad entre dispositivos.
En resumen, FFmpeg ofrece una solución versátil y potente para comprimir video para la web. Si eliges los códecs con cuidado y ajustas con precisión tus parámetros de codificación, puedes optimizar el rendimiento del video sin comprometer la calidad.
Para el procesamiento de video automatizado a gran escala, considera usar el servicio de Encoding de video de Transloadit, que ofrece pipelines de codificación optimizados y selección automática de formato según las capacidades del navegador.
