Automatización y desarrollo

Cómo convertir imágenes en lote con FFmpeg: guía práctica

5 min de lectura

Tienes 500 capturas de pantalla en PNG que necesitas convertir a WebP para tu sitio web. O una carpeta de exportaciones TIFF de Lightroom que deben ser JPG. FFmpeg es conocido principalmente como herramienta de vídeo, pero gestiona imágenes igual de bien — y como funciona desde la línea de comandos, procesa cualquier número de archivos con un solo comando.

¿Por qué usar FFmpeg para imágenes?

Es probable que FFmpeg ya esté instalado si haces trabajo de vídeo. Admite una amplia gama de formatos y se integra de forma natural en scripts de shell y pipelines CI. Para formatos RAW de cámara (CR2, NEF, ARW), usa darktable o RawTherapee — el soporte RAW de FFmpeg es limitado.

Instalar FFmpeg

bash
# macOS
brew install ffmpeg

# Ubuntu / Debian
sudo apt install ffmpeg

# Windows (Chocolatey)
choco install ffmpeg
bash
ffmpeg -version

El patrón básico

Cada comando de conversión en lote sigue la misma estructura: un bucle de shell (Linux/macOS) o un bucle for (Windows). Regla clave: nunca sobrescribas los archivos fuente — escribe siempre en un directorio de salida separado.

Convertir todos los PNG a JPG

bash
mkdir -p output
for f in *.png; do
  ffmpeg -i "$f" -q:v 2 "output/${f%.png}.jpg"
done
bash
mkdir output
for %f in (*.png) do ffmpeg -i "%f" -q:v 2 "output/%~nf.jpg"
bash
New-Item -ItemType Directory -Force output
Get-ChildItem *.png | ForEach-Object {
  ffmpeg -i $_.FullName -q:v 2 "output/$($_.BaseName).jpg"
}
-q:vCalidadUso típico
1–2Casi sin pérdidaImpresión, archivado
3–5Alta calidadFotografía web
6–10Calidad mediaPrevisualizaciones
11+Baja calidadEvitar

Convertir todos los JPG a WebP

bash
mkdir -p output
for f in *.jpg *.jpeg; do
  [ -f "$f" ] || continue
  ffmpeg -i "$f" -quality 85 "output/${f%.*}.webp"
done
bash
mkdir -p output
for f in *.png; do
  ffmpeg -i "$f" -lossless 1 "output/${f%.png}.webp"
done

WebP produce archivos un 25–35 % más pequeños que un JPG equivalente. Para fotografías, 80–85 es el rango óptimo de calidad. Para logos y gráficos con texto, usa WebP sin pérdida.

Convertir a PNG

bash
mkdir -p output
for f in *.jpg *.jpeg; do
  [ -f "$f" ] || continue
  ffmpeg -i "$f" "output/${f%.*}.png"
done

Convertir formatos mixtos

bash
mkdir -p output
for f in *.jpg *.jpeg *.png *.webp *.tiff *.bmp; do
  [ -f "$f" ] || continue
  ffmpeg -i "$f" -q:v 3 "output/${f%.*}.jpg"
done

Redimensionar y convertir en un solo paso

bash
mkdir -p output
for f in *.png; do
  ffmpeg -i "$f" -vf scale=1080:-1 -q:v 3 "output/${f%.png}.jpg"
done
bash
mkdir -p output
for f in *.jpg; do
  ffmpeg -i "$f" -vf "crop='min(iw,ih)':'min(iw,ih)',scale=200:200" \
    "output/${f%.jpg}_thumb.jpg"
done

Procesamiento recursivo de subdirectorios

bash
find . -name "*.png" -not -path "./output*" | while read f; do
  output="output/${f#./}"
  mkdir -p "$(dirname "$output")"
  ffmpeg -i "$f" -q:v 3 "${output%.png}.jpg"
done

Procesamiento paralelo para mayor velocidad

bash
mkdir -p output
ls *.png | xargs -P 4 -I {} sh -c 'ffmpeg -i "$1" -q:v 3 "output/${1%.png}.jpg"' _ {}

En una máquina de 8 núcleos con almacenamiento SSD, el procesamiento paralelo reduce típicamente el tiempo de conversión entre 3 y 5 veces.

Indicador de progreso

bash
total=$(ls *.png | wc -l)
count=0
mkdir -p output
for f in *.png; do
  count=$((count + 1))
  echo "[$count/$total] $f"
  ffmpeg -loglevel quiet -i "$f" -q:v 3 "output/${f%.png}.jpg"
done

Manejo de errores

bash
mkdir -p output
error_log="errors.txt"
> "$error_log"
for f in *.jpg *.jpeg *.png *.webp; do
  [ -f "$f" ] || continue
  if ffmpeg -loglevel error -i "$f" -quality 85 "output/${f%.*}.webp" 2>>"$error_log"; then
    echo "✓ $f"
  else
    echo "✗ $f"
  fi
done

Referencia de comandos

ConversiónComando (Linux/macOS)Notas
Todos PNG → JPGfor f in *.pngdo ffmpeg -i "$f" -q:v 3 output/${f%.png}.jpg
Todos JPG → WebPfor f in *.jpgdo ffmpeg -i "$f" -quality 85 output/${f%.jpg}.webp
Todos JPG → PNGfor f in *.jpgdo ffmpeg -i "$f" output/${f%.jpg}.png
Todos → WebP sin pérdidafor f in *.pngdo ffmpeg -i "$f" -lossless 1 output/${f%.png}.webp
Redimensionar + convertirfor f in *.jpgdo ffmpeg -i "$f" -vf scale=1080:-1 -q:v 3 output/${f%.jpg}.jpg

Cuándo FFmpeg no es la herramienta adecuada

Formatos RAW (CR2, NEF, ARW) — soporte limitado. Usa darktable o RawTherapee.

Codificación AVIF — posible con -c:v libaom-av1 pero muy lenta sin aceleración hardware. libavif o Squoosh CLI son más rápidos.

Perfiles de color ICC — FFmpeg no siempre los preserva. Para trabajo crítico de color, ImageMagick es más fiable.

¿Solo unos pocos archivos? Una herramienta online como FastConvert es más rápida — sin instalación.

Preguntas frecuentes

Por defecto no. Para preservarlos, añadir -map_metadata 0: ffmpeg -i input.jpg -map_metadata 0 -q:v 3 output.jpg

Ocurre cuando el JPG fuente ya está muy comprimido. Siempre convierte desde la fuente de mayor calidad disponible.

Usar PNG como formato de salida (sin pérdida) o -lossless 1 para WebP.

Depende de cómo esté compilado FFmpeg. En macOS con Homebrew, generalmente funciona.

Añadir -y para sobrescribir automáticamente o -n para omitir archivos existentes.

Resumen

La conversión en lote con FFmpeg se reduce a un bucle shell simple. Prueba siempre con un lote pequeño antes de procesar toda tu biblioteca.

¿Convertir imágenes sin línea de comandos? FastConvert — gratis, sin registro.

Compartir