FFmpeg: Guía Completa para Procesamiento de Audio y Video en Linux
FFmpeg es la navaja suiza del procesamiento multimedia. Este software libre y de código abierto permite convertir, grabar, transmitir y procesar audio y video desde la línea de comandos, siendo la base de cientos de aplicaciones populares como VLC, YouTube, Twitch y muchas más. En esta guía aprenderás desde los conceptos básicos hasta técnicas avanzadas de transcodificación.
¿Qué es FFmpeg?
FFmpeg es un framework multimedia completo que incluye tres herramientas principales:
- ffmpeg: La herramienta principal para convertir y procesar archivos multimedia.
- ffprobe: Analizador de archivos multimedia que muestra metadatos detallados.
- ffplay: Reproductor multimedia simple basado en SDL y las librerías de FFmpeg.
Internamente, FFmpeg usa librerías como libavcodec (codecs), libavformat (contenedores), libavfilter (filtros) y libswscale (escalado), que forman el corazón de su arquitectura modular.
Instalación en Linux
FFmpeg está disponible en los repositorios de la mayoría de distribuciones Linux:
# Ubuntu / Debian
sudo apt update && sudo apt install ffmpeg
# CentOS / RHEL / Rocky Linux (con EPEL)
sudo dnf install epel-release
sudo dnf install ffmpeg ffmpeg-devel
# Arch Linux
sudo pacman -S ffmpeg
# Fedora
sudo dnf install ffmpeg
# Verificar instalación
ffmpeg -version
ffprobe -version
Para obtener la versión más reciente con todos los codecs (incluidos los propietarios como libfdk_aac o libx265), puedes compilar desde el código fuente o usar compilaciones estáticas de johnvansickle.com.
Conceptos Fundamentales
Antes de los comandos, es importante entender la diferencia entre contenedor y codec:
- Contenedor (formato): El archivo que envuelve los datos: MP4, MKV, AVI, MOV, WebM. Define cómo se organizan los streams dentro del archivo.
- Codec: El algoritmo de compresión/descompresión: H.264, H.265/HEVC, AV1, VP9 para video; AAC, MP3, Opus, FLAC para audio.
- Bitrate: Cantidad de datos por segundo. A mayor bitrate, mayor calidad y mayor tamaño de archivo.
- Keyframe (I-frame): Frame completo sin compresión diferencial, esencial para la edición y el seeking.
La sintaxis básica de FFmpeg sigue este patrón:
ffmpeg [opciones_globales] \
[opciones_entrada] -i input.ext \
[opciones_salida] output.ext
Conversiones Básicas de Formato
La operación más común es convertir entre formatos. FFmpeg infiere el codec de destino según la extensión:
# Convertir MP4 a MKV (copia los streams sin recodificar)
ffmpeg -i video.mp4 -c copy video.mkv
# Convertir AVI a MP4 con H.264 y AAC
ffmpeg -i video.avi -c:v libx264 -c:a aac output.mp4
# Convertir MOV a WebM (VP9 + Opus)
ffmpeg -i video.mov -c:v libvpx-vp9 -c:a libopus output.webm
# Extraer solo el audio de un video
ffmpeg -i video.mp4 -vn -c:a copy audio.aac
ffmpeg -i video.mp4 -vn -c:a libmp3lame -q:a 2 audio.mp3
# Convertir audio a diferentes formatos
ffmpeg -i audio.wav -c:a aac -b:a 192k audio.m4a
ffmpeg -i audio.mp3 -c:a flac audio.flac
ffmpeg -i audio.flac -c:a libopus -b:a 128k audio.opus
Control de Calidad y Compresión
FFmpeg ofrece varios métodos para controlar la calidad del video de salida:
CRF (Constant Rate Factor) — Calidad constante
El modo CRF es el más recomendado para archivos locales. Menor valor = mayor calidad y mayor tamaño:
# H.264 — CRF entre 18 (casi sin pérdida) y 28 (comprimido). Recomendado: 23
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a aac -b:a 128k output.mp4
# H.265/HEVC — CRF entre 24 y 28 para calidad equivalente a H.264 CRF 23
ffmpeg -i input.mp4 -c:v libx265 -crf 28 -c:a aac -b:a 128k output.mp4
# AV1 con libaom-av1 — más lento pero mejor compresión
ffmpeg -i input.mp4 -c:v libaom-av1 -crf 30 -b:v 0 output.mp4
# VP9
ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 33 -b:v 0 -c:a libopus output.webm
Bitrate fijo (CBR/VBR)
# Bitrate de video fijo en 2 Mbps (streaming)
ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -c:a aac output.mp4
# Two-pass encoding para bitrate objetivo preciso
ffmpeg -i input.mp4 -c:v libx264 -b:v 1M -pass 1 -an -f null /dev/null
ffmpeg -i input.mp4 -c:v libx264 -b:v 1M -pass 2 -c:a aac output.mp4
Presets de velocidad de codificación
# Presets para H.264: ultrafast, superfast, veryfast, faster,
# fast, medium (default), slow, slower, veryslow
ffmpeg -i input.mp4 -c:v libx264 -preset slow -crf 22 output.mp4
# Veryslow = mejor compresión, más tiempo de codificación
ffmpeg -i input.mp4 -c:v libx264 -preset veryslow -crf 22 output.mp4
Recorte, Escalado y Filtros de Video
FFmpeg incluye un potente sistema de filtros (-vf para video, -af para audio) que permite transformar el contenido multimedia:
# Recortar duración: desde el segundo 30, durante 60 segundos
ffmpeg -i input.mp4 -ss 00:00:30 -t 00:01:00 -c copy output.mp4
# Recortar entre timestamps específicos
ffmpeg -i input.mp4 -ss 00:01:15 -to 00:03:45 -c copy output.mp4
# Escalar a 1280x720 manteniendo aspect ratio
ffmpeg -i input.mp4 -vf "scale=1280:720" output.mp4
# Escalar solo el ancho, altura automática
ffmpeg -i input.mp4 -vf "scale=1280:-1" output.mp4
# Escalar a 720p con padding para mantener ratio exacto (letterbox)
ffmpeg -i input.mp4 -vf "scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2" output.mp4
# Rotar video 90 grados en sentido horario
ffmpeg -i input.mp4 -vf "transpose=1" output.mp4
# Voltear horizontalmente (mirror)
ffmpeg -i input.mp4 -vf "hflip" output.mp4
# Recortar un área específica del frame (crop=ancho:alto:x:y)
ffmpeg -i input.mp4 -vf "crop=640:480:100:50" output.mp4
# Cambiar velocidad: 2x más rápido
ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" -af "atempo=2.0" output.mp4
# Aplicar watermark de imagen
ffmpeg -i input.mp4 -i logo.png \
-filter_complex "overlay=W-w-10:H-h-10" output.mp4
# Generar thumbnails — 1 frame cada 10 segundos
ffmpeg -i input.mp4 -vf "fps=1/10" thumbnails/thumb%04d.jpg
Procesamiento de Audio
FFmpeg también es muy poderoso para manipular audio con precisión:
# Normalizar volumen de audio
ffmpeg -i input.mp3 -af "loudnorm" output.mp3
# Ajustar volumen: +6dB
ffmpeg -i input.mp3 -af "volume=6dB" output.mp3
# Eliminar silencio al inicio y al final
ffmpeg -i input.mp3 -af "silenceremove=start_periods=1:start_silence=0.1:start_threshold=-50dB" output.mp3
# Convertir estéreo a mono
ffmpeg -i stereo.mp3 -ac 1 mono.mp3
# Cambiar sample rate a 44100 Hz
ffmpeg -i input.wav -ar 44100 output.wav
# Mezclar dos archivos de audio
ffmpeg -i audio1.mp3 -i audio2.mp3 \
-filter_complex "[0:a][1:a]amix=inputs=2:duration=longest" mixed.mp3
# Extraer canal izquierdo de audio estéreo
ffmpeg -i stereo.mp3 -af "channelsplit=channel_layout=stereo:channels=FL" left.mp3
Streaming y Transmisión en Vivo
FFmpeg es ampliamente usado para transmitir a plataformas como Twitch, YouTube Live o servidores RTMP propios:
# Transmitir a Twitch via RTMP
ffmpeg -re -i input.mp4 \
-c:v libx264 -preset veryfast -b:v 3000k \
-c:a aac -b:a 160k \
-f flv rtmp://live.twitch.tv/live/TU_STREAM_KEY
# Transmitir pantalla de escritorio (Linux con X11)
ffmpeg -f x11grab -r 30 -s 1920x1080 -i :0.0 \
-c:v libx264 -preset ultrafast -b:v 4M \
-f flv rtmp://servidor/live/key
# Capturar desde webcam y micrófono
ffmpeg -f v4l2 -i /dev/video0 \
-f alsa -i default \
-c:v libx264 -preset ultrafast \
-c:a aac output.mp4
# Crear stream HLS (HTTP Live Streaming)
ffmpeg -i input.mp4 \
-c:v libx264 -b:v 1M \
-hls_time 6 -hls_list_size 0 \
playlist.m3u8
FFprobe: Inspección y Automatización
FFprobe permite analizar archivos multimedia y obtener metadatos en formatos procesables por scripts:
# Ver información detallada del archivo
ffprobe -v quiet -print_format json -show_format -show_streams input.mp4
# Obtener duración en segundos
ffprobe -v error -show_entries format=duration \
-of default=noprint_wrappers=1:nokey=1 input.mp4
# Obtener resolución del video
ffprobe -v error -select_streams v:0 \
-show_entries stream=width,height \
-of csv=s=x:p=0 input.mp4
Para procesar múltiples archivos en batch, puedes combinar FFmpeg con Bash:
#!/bin/bash
# Convertir todos los AVI a MP4 en el directorio actual
for file in *.avi; do
filename="${file%.*}"
ffmpeg -i "$file" \
-c:v libx264 -crf 23 -preset medium \
-c:a aac -b:a 128k \
"${filename}.mp4"
echo "Convertido: $file → ${filename}.mp4"
done
# Comprimir todos los MP4 que pesen más de 100MB
find . -name "*.mp4" -size +100M | while read video; do
output="compressed_$(basename "$video")"
ffmpeg -i "$video" -c:v libx265 -crf 28 -c:a copy "$output"
done
FFmpeg en Pipelines DevOps
FFmpeg tiene aplicaciones directas en entornos de producción:
- Pipelines de transcodificación: Procesar videos a múltiples resoluciones (1080p, 720p, 480p) para adaptive streaming.
- Generación de thumbnails: Extraer frames representativos para catálogos y CDN.
- Procesamiento en contenedores: Ejecutar FFmpeg dentro de Docker para escalar horizontalmente.
- Integración con almacenamiento cloud: Procesar videos directamente desde S3 usando URLs presignadas.
- Monitoreo de streams: Verificar la salud de streams RTMP/HLS en producción.
# Transcodificar video desde S3 y subir resultado
ffmpeg -i "$(aws s3 presign s3://mi-bucket/video.mp4)" \
-c:v libx264 -crf 23 -preset fast \
-c:a aac -b:a 128k \
output.mp4 && \
aws s3 cp output.mp4 s3://mi-bucket/procesados/output.mp4
# Dockerfile para servicio de transcodificación
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y ffmpeg && rm -rf /var/lib/apt/lists/*
COPY transcode.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/transcode.sh
ENTRYPOINT ["/usr/local/bin/transcode.sh"]
Conclusión
FFmpeg es una herramienta indispensable para cualquier profesional que trabaje con multimedia, desde desarrolladores y administradores de sistemas hasta creadores de contenido. Su flexibilidad, la amplitud de formatos que soporta y su disponibilidad en todas las plataformas lo convierten en el estándar de facto para el procesamiento multimedia por línea de comandos.
La curva de aprendizaje puede parecer pronunciada al inicio por la cantidad de opciones disponibles, pero con los ejemplos de esta guía tienes una base sólida para abordar la mayoría de tareas multimedia cotidianas. Para casos más avanzados como filtros complejos, hardware acceleration (NVENC, VAAPI, VideoToolbox) y procesamiento en tiempo real, te recomendamos explorar la documentación oficial en ffmpeg.org.