Automação e desenvolvimento

Como converter imagens em lote com FFmpeg: guia prático

5 min de leitura
Como converter imagens em lote com FFmpeg: guia prático

Você tem 500 capturas de tela em PNG para converter em WebP para o seu site. Ou uma pasta de exportações TIFF do Lightroom para transformar em JPG. FFmpeg é mais conhecido como ferramenta de vídeo, mas lida com imagens igualmente bem — e por funcionar na linha de comando, processa qualquer número de arquivos com um único comando.

Por que usar FFmpeg para imagens?

O FFmpeg provavelmente já está instalado se você faz trabalho com vídeo. Suporta uma ampla variedade de formatos e se integra naturalmente em scripts shell e pipelines CI. Para formatos RAW (CR2, NEF, ARW), use darktable ou RawTherapee — o suporte RAW do FFmpeg é limitado.

Instalar o FFmpeg

bash
# macOS
brew install ffmpeg

# Ubuntu / Debian
sudo apt install ffmpeg

# Windows (Chocolatey)
choco install ffmpeg

bash
ffmpeg -version

O padrão básico

Todo comando de conversão em lote segue a mesma estrutura: um loop shell (Linux/macOS) ou um loop for (Windows). Regra essencial: nunca sobrescreva os arquivos fonte — sempre escreva em um diretório de saída separado.

Converter todos os PNG em 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:vQualidadeUso típico
1–2Quase sem perdaImpressão, arquivo
3–5Alta qualidadeFotografia web
6–10Qualidade médiaPré-visualizações
11+Baixa qualidadeEvitar

Converter todos os JPG em 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 produz arquivos tipicamente 25–35 % menores que um JPG equivalente. Para fotos, 80–85 é a faixa ideal. Para logos e gráficos com texto, use WebP sem perdas.

Converter para PNG

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

Converter formatos mistos

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 e converter em uma única passagem

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

Processamento recursivo de subdiretórios

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

Processamento paralelo para maior velocidade

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

Em uma máquina de 8 núcleos com SSD, o processamento paralelo reduz tipicamente o tempo de conversão de 3 a 5 vezes.

Indicador de progresso

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

Tratamento de erros

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

Referência de comandos

ConversãoComando (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 sem perdasfor f in *.pngdo ffmpeg -i "$f" -lossless 1 output/${f%.png}.webp
Redimensionar + converterfor f in *.jpgdo ffmpeg -i "$f" -vf scale=1080:-1 -q:v 3 output/${f%.jpg}.jpg

Quando FFmpeg não é a ferramenta certa

Formatos RAW (CR2, NEF, ARW) — suporte limitado. Use darktable ou RawTherapee.

Codificação AVIF — possível via -c:v libaom-av1 mas muito lento sem aceleração de hardware. libavif ou Squoosh CLI são mais rápidos.

Perfis de cor ICC — FFmpeg nem sempre os preserva. Para trabalho crítico de cor, ImageMagick é mais confiável.

Apenas alguns arquivos? Uma ferramenta online como FastConvert é mais rápida — sem instalação.

Perguntas frequentes

Por padrão não. Para preservar, adicionar -map_metadata 0: ffmpeg -i input.jpg -map_metadata 0 -q:v 3 output.jpg

Acontece quando o JPG fonte já está muito comprimido. Sempre converta da fonte de maior qualidade disponível.

Use PNG como formato de saída (sem perdas) ou -lossless 1 para WebP.

Depende de como o FFmpeg foi compilado. No macOS com Homebrew, geralmente funciona.

Adicionar -y para sobrescrever automaticamente ou -n para pular arquivos existentes.

Conclusão

A conversão em lote com FFmpeg se resume a um loop shell simples. Sempre teste em um lote pequeno antes de processar toda a sua biblioteca.

Converter imagens sem linha de comando? FastConvert — gratuito, sem cadastro.

Partilhar