32blogby StudioMitsu

La guía completa de compresión de video con FFmpeg

Guía exhaustiva para comprimir video con FFmpeg. Aprende cuándo usar CRF, bitrate objetivo, presets y codificación de 2 pasadas — con configuraciones listas para cada caso de uso.

8 min read
Contenido

¿Archivos de video demasiado grandes para subir? ¿El almacenamiento se llena rápido? FFmpeg puede resolver ambos problemas con un solo comando.

Esta guía recorre CRF, bitrate objetivo, codificación de 2 pasadas y presets — los cuatro enfoques principales de compresión de video. También encontrarás comandos listos para copiar para casos de uso comunes: entrega web, redes sociales, archivado y dispositivos móviles.

Conceptos básicos de la compresión de video

Antes de entrar en los comandos, conviene entender el compromiso fundamental: calidad vs. tamaño de archivo.

Hay dos estrategias principales de codificación:

  • Bitrate variable (VBR) — Usa más bits para escenas complejas y menos para las simples. Logra mejor calidad con tamaños más pequeños.
  • Bitrate constante (CBR) — Mantiene una tasa de datos fija a lo largo de todo el video. Se usa cuando se requieren garantías de ancho de banda, como en transmisiones en vivo.

Los dos códecs dominantes hoy en día son H.264 (libx264) y H.265 (libx265). H.265 produce aproximadamente la mitad del tamaño de archivo de H.264 a calidad equivalente, pero codifica más lento y tiene menor compatibilidad de reproducción en dispositivos antiguos.

El códec se especifica con la bandera -c:v. Usa -c:v libx264 para H.264 y -c:v libx265 para H.265.

Comprimir con CRF (Calidad constante)

CRF — Factor de Tasa Constante — fija un nivel de calidad y deja que el codificador decida el tamaño del archivo. Es el método de compresión más popular de FFmpeg y la opción predeterminada correcta para la mayoría de los casos de uso.

Compresión CRF con H.264:

bash
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a copy output.mp4

Compresión CRF con H.265 (menor tamaño de archivo a calidad equivalente):

bash
ffmpeg -i input.mp4 -c:v libx265 -crf 28 -c:a copy output.mp4

Para aumentar la calidad (a costa del tamaño de archivo), reduce el CRF. Para material con mucho detalle como grabaciones de pantalla o animación, prueba CRF 18. Para subidas a redes sociales donde el tamaño importa más que la calidad perfecta, CRF 30–35 puede reducir drásticamente el tamaño sin degradación perceptible.

Comprimir con bitrate objetivo

El bitrate objetivo es la opción correcta cuando necesitas control estricto sobre el tamaño del archivo o el ancho de banda de transmisión. Si tienes un objetivo como "este archivo debe pesar menos de 50 MB", este es tu método.

Una estimación aproximada de tamaño: duración (segundos) × bitrate (bps) ÷ 8 = bytes. Un video de 60 segundos a 2 Mbps resulta en aproximadamente 15 MB.

Codificar video con un objetivo de 2 Mbps:

bash
ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -c:a copy output.mp4

Especificar tanto el bitrate de video como de audio:

bash
ffmpeg -i input.mp4 -c:v libx264 -b:v 1800k -c:a aac -b:a 192k output.mp4

Una limitación del bitrate objetivo: se usa la misma cantidad de datos independientemente de la complejidad de la escena. Las escenas simples tendrán más bits de los necesarios; las escenas complejas pueden no tener suficientes. A menos que tengas un requisito estricto de tamaño, CRF generalmente produce mejores resultados.

Optimizar con codificación de 2 pasadas

La codificación de 2 pasadas es un proceso de dos etapas: FFmpeg primero analiza todo el video, luego lo codifica usando ese análisis. Esto le permite distribuir los bits de manera más eficiente a lo largo del video. Es más beneficiosa para contenido de larga duración o cuando necesitas la mejor calidad posible a un bitrate fijo.

Pasada 1 (solo análisis — no se crea video de salida):

bash
ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -pass 1 -an -f null /dev/null

Pasada 2 (codificación final):

bash
ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -pass 2 -c:a aac -b:a 192k output.mp4

Para H.265, usa -c:v libx265 -x265-params pass=1 en la primera pasada.

La codificación de 2 pasadas toma aproximadamente el doble de tiempo que una sola pasada, pero produce mejor calidad al mismo bitrate. Es especialmente efectiva para autoría de DVD, entrega broadcast, o cualquier escenario con un límite estricto de tamaño de archivo. Para compresión cotidiana, CRF suele ser suficiente.

Controlar velocidad y eficiencia con presets

Los libx264 y libx265 de FFmpeg incluyen un sistema de presets que equilibra la velocidad de codificación contra la eficiencia de compresión.

Presets del más rápido al más lento:

ultrafastsuperfastveryfastfasterfastmedium (predeterminado) → slowslowerveryslow

Codificar con un preset especificado:

bash
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset slow -c:a copy output.mp4

Para comparar múltiples presets en la misma entrada:

bash
for preset in fast medium slow veryslow; do
  ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset $preset -c:a copy output_${preset}.mp4
done

Recomendaciones prácticas: usa medium (predeterminado) o slow para la mayoría de las tareas de compresión; usa veryslow cuando quieras el archivo más pequeño posible y tengas tiempo de sobra; usa fast o veryfast para procesamiento en tiempo real o lotes grandes.

Configuraciones óptimas por caso de uso

Comandos listos para usar para los escenarios más comunes.

Caso de usoCódecCRFPresetNotas
Entrega webH.26423slowMáxima compatibilidad
Redes sociales (X / Instagram)H.26428–30mediumPrioridad tamaño
Archivado a largo plazoH.26524veryslowMejor ratio para almacenamiento
Reproducción móvilH.26426fastCombinar con escalado de resolución

Entrega web (compatibilidad primero):

bash
ffmpeg -i input.mp4 \
  -c:v libx264 -crf 23 -preset slow \
  -c:a aac -b:a 128k \
  -movflags +faststart \
  output_web.mp4

-movflags +faststart mueve el átomo moov al inicio del archivo, permitiendo que la reproducción comience antes de que se complete la descarga. Esta bandera es imprescindible para video web.

Redes sociales (tamaño de archivo mínimo):

bash
ffmpeg -i input.mp4 \
  -c:v libx264 -crf 30 -preset medium \
  -vf "scale=1280:-2" \
  -c:a aac -b:a 96k \
  output_sns.mp4

Archivado a largo plazo (H.265, compresión máxima):

bash
ffmpeg -i input.mp4 \
  -c:v libx265 -crf 24 -preset veryslow \
  -c:a aac -b:a 128k \
  output_archive.mp4

Reproducción móvil (reducir escala + ligero):

bash
ffmpeg -i input.mp4 \
  -c:v libx264 -crf 26 -preset fast \
  -vf "scale=720:-2" \
  -c:a aac -b:a 96k \
  output_mobile.mp4

Errores comunes y cómo solucionarlos

Error 1: El archivo se hizo más grande después de la compresión

Si el video fuente ya estaba comprimido, recodificar puede en realidad aumentar el tamaño del archivo debido a la sobrecarga de codificación. Solución: copia los flujos del video con -c:v copy, o establece un bitrate objetivo por debajo del bitrate original del fuente.

Error 2: Fotogramas verdes o negros en la salida

Esto generalmente es un problema de compatibilidad de formato de píxeles. Añadir -pix_fmt yuv420p lo resuelve en la mayoría de los casos:

bash
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -pix_fmt yuv420p -c:a copy output.mp4

Error 3: La calidad del audio se ha degradado

Error 4: La codificación es extremadamente lenta

Combinar el preset veryslow, resolución 4K+ y H.265 puede resultar en tiempos de codificación medidos en horas. La codificación GPU reduce esto drásticamente:

bash
# GPU NVIDIA (NVENC)
ffmpeg -i input.mp4 -c:v h264_nvenc -cq 23 -b:v 0 -c:a copy output.mp4

Ten en cuenta que los codificadores GPU son generalmente menos eficientes que los codificadores CPU con configuraciones equivalentes — obtendrás archivos más grandes o menor calidad con los mismos valores nominales. Usa la codificación GPU cuando la velocidad sea la prioridad.

Conclusión

Elegir el enfoque de compresión correcto marca una diferencia real en los resultados.

  • Para compresión priorizando calidad, usa CRF — elige un valor y deja que FFmpeg se encargue del resto
  • Para requisitos estrictos de tamaño, usa 2 pasadas — más efectivo para broadcast y entrega
  • Ajusta velocidad vs. eficiencia con presetsslow y veryslow mejoran significativamente los resultados
  • No olvides -movflags +faststart para video web — es fácil de pasar por alto e importante

Si eres nuevo en FFmpeg y quieres ponerte al día con lo básico primero, consulta Tutorial de Uso de FFmpeg. Si necesitas cortar material sin ninguna pérdida de calidad, Corte Sin Pérdida con FFmpeg cubre ese flujo de trabajo.


¿No quieres escribir estos comandos CRF cada vez? ffmpeg-quick te permite ejecutar npx ffmpeg-quick compress input.mp4 y obtener valores predeterminados sensatos al instante. Usa --dry-run para ver el comando FFmpeg real.