Compressão de vídeo com FFmpeg: guia de boas práticas
Domine compressão de vídeo com FFmpeg neste guia técnico denso cobrindo CRF, presets, two-pass, comparação de codecs, scaling de resolução e cenários reais.

Compressão de vídeo com FFmpeg se resume a balancear três botões — CRF (qualidade), preset (velocidade) e codec (eficiência). Este guia aprofundado cobre tudo: da matemática do CRF a two-pass encoding, benchmarks H.264 vs H.265 vs AV1, e cenários reais (web, social, arquivamento, HLS). Cada comando aqui é pronto pra copiar e colar.
Teste configurações de compressão no navegador antes de scriptar — solte um clipe, escolha CRF / preset, baixe o resultado.
Entendendo o CRF (Constant Rate Factor)
CRF é a configuração mais importante para compressão de vídeo baseada em qualidade. Ele diz ao encoder para mirar num nível de qualidade visual consistente, deixando o bitrate variar conforme necessário. CRF menor = qualidade maior = arquivo maior. CRF maior = qualidade menor = arquivo menor.
Valores de CRF para H.264 (libx264)
ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4
A escala CRF do H.264 vai de 0 (lossless) a 51 (pior qualidade). O que cada valor produz:
| CRF | Nível de qualidade | Caso de uso típico | Tamanho de arquivo (relativo a CRF 23) |
|---|---|---|---|
| 0 | Lossless | Arquivamento, masters de edição | 10-50x maior |
| 14 | Quase lossless | Pós-produção profissional | 4-6x maior |
| 18 | Visualmente lossless | Entrega de alta qualidade, streaming premium | 2-3x maior |
| 20 | Excelente | Vídeo web de alta qualidade | 1.5-2x maior |
| 23 | Boa (padrão) | Uso geral, entrega web | 1x (baseline) |
| 26 | Aceitável | Redes sociais, entrega mobile | 0.5-0.7x |
| 28 | Moderada | Entrega com banda restrita | 0.3-0.5x |
| 32 | Baixa | Previews, thumbnails | 0.15-0.25x |
| 40 | Muito baixa | Compressão extrema (mal assistível) | 0.05-0.1x |
| 51 | Pior | Nunca use | Minúsculo |
O sweet spot para a maioria dos casos é CRF 18-28. Abaixo de 18, você está gastando bits em diferenças de qualidade que a maioria dos espectadores nem percebe. Acima de 28, os artefatos ficam claramente visíveis.
Valores de CRF para H.265 (libx265)
H.265 atinge a mesma qualidade visual com aproximadamente 40-50% menos bitrate que H.264. No entanto, a escala de CRF muda: CRF 28 em H.265 equivale aproximadamente a CRF 23 em H.264.
ffmpeg -i input.mp4 -c:v libx265 -crf 28 output.mp4
| CRF (H.265) | CRF H.264 equivalente | Nível de qualidade |
|---|---|---|
| 18 | ~14 | Quase lossless |
| 22 | ~18 | Visualmente lossless |
| 24 | ~20 | Excelente |
| 28 | ~23 | Boa (padrão) |
| 32 | ~26 | Aceitável |
| 36 | ~30 | Baixa |
Como escolher o CRF certo
Uma abordagem prática:
- Comece com o padrão (23 para H.264, 28 para H.265)
- Olhe o output — a qualidade está aceitável?
- Ajuste em 2-4 pontos em qualquer direção
- Faça teste A/B — encode a mesma cena complexa com dois valores de CRF e compare
As cenas que mais revelam artefatos de compressão são: movimento rápido, texturas finas (grama, tecido), gradientes (céu, neblina), e cenas escuras com detalhe sutil. Para uma introdução amigável a iniciantes, veja nosso guia de compressão de vídeo com FFmpeg.
Presets de encoding: velocidade vs qualidade
O parâmetro preset do FFmpeg controla quanto tempo de CPU o encoder gasta otimizando a compressão. Presets mais lentos atingem compressão melhor (arquivos menores na mesma qualidade) ao custo de tempos de encoding maiores.
Benchmark de preset H.264
Todos os testes abaixo usam CRF 23 com fonte 1080p 60fps (2 minutos):
| Preset | Tempo de encoding | Tamanho do arquivo | Qualidade (VMAF) |
|---|---|---|---|
| ultrafast | 15s | 85 MB | 92.1 |
| superfast | 22s | 62 MB | 93.8 |
| veryfast | 30s | 48 MB | 94.5 |
| faster | 40s | 42 MB | 95.0 |
| fast | 52s | 38 MB | 95.3 |
| medium | 70s | 35 MB | 95.5 |
| slow | 120s | 33 MB | 95.7 |
| slower | 210s | 31 MB | 95.8 |
| veryslow | 450s | 30 MB | 95.9 |
| placebo | 1800s | 29.5 MB | 95.9 |
Observações-chave:
mediumé o padrão e o sweet spot para a maioria dos workflows- Indo de
mediumparasloweconomiza ~6% de tamanho mas leva 70% mais tempo - Indo de
mediumparaverysloweconomiza ~14% mas leva 6.4x mais tempo placebooferece praticamente nenhuma melhoria sobreveryslow— nunca useultrafastproduz arquivos 2.4x maiores quemedium— evite na entrega final
# Good default for most use cases
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium output.mp4
# When encoding time matters more than file size
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset fast output.mp4
# When file size matters more than encoding time
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset slow output.mp4
Comportamento dos presets H.265
Os presets H.265 seguem a mesma convenção de nomes, mas o encoding é significativamente mais lento em cada nível:
| Preset | Tempo H.264 | Tempo H.265 | Tamanho H.265 |
|---|---|---|---|
| fast | 52s | 180s | 25 MB |
| medium | 70s | 300s | 22 MB |
| slow | 120s | 600s | 20 MB |
Encoding H.265 leva aproximadamente 3-5x mais tempo que H.264 no mesmo preset, mas produz arquivos 30-40% menores em qualidade equivalente.
Two-pass encoding
Two-pass encoding te dá controle preciso sobre o bitrate de saída, o que é essencial quando você precisa atingir um tamanho de arquivo específico (ex.: "este vídeo tem que ter menos de 50MB").
Como funciona
- Pass 1: FFmpeg analisa o vídeo e cria um arquivo de log com dados de complexidade
- Pass 2: FFmpeg usa o log para distribuir bits de forma ótima — mais bits para cenas complexas, menos para simples
Comando básico de two-pass
# Pass 1 — analyze (output is discarded)
ffmpeg -i input.mp4 -c:v libx264 -b:v 4M -pass 1 -f null /dev/null
# Pass 2 — encode using analysis data
ffmpeg -i input.mp4 -c:v libx264 -b:v 4M -pass 2 output.mp4
Calculando o bitrate alvo
Para encaixar um vídeo num tamanho de arquivo alvo:
Video bitrate = (Target file size in bits - Audio size in bits) / Duration in seconds
Exemplo: vídeo de 10 minutos, alvo de 100MB, áudio 128kbps:
Audio size = 128,000 bps × 600s = 76,800,000 bits = 9.6 MB
Video bitrate = (100 MB - 9.6 MB) × 8,000,000 / 600 = 1,205,333 bps ≈ 1.2 Mbps
ffmpeg -i input.mp4 -c:v libx264 -b:v 1200k -pass 1 -c:a aac -b:a 128k -f null /dev/null
ffmpeg -i input.mp4 -c:v libx264 -b:v 1200k -pass 2 -c:a aac -b:a 128k output.mp4
CRF vs two-pass: quando usar qual
| Abordagem | Melhor para | Controle |
|---|---|---|
| CRF | Qualidade consistente, tamanho desconhecido | Foco em qualidade |
| Two-pass | Tamanho ou bitrate alvo | Foco em tamanho |
| CRF + maxrate | Qualidade com teto de bitrate | Streaming |
Para streaming com teto de bitrate:
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -maxrate 4M -bufsize 8M output.mp4
Isso mira na qualidade do CRF 23 mas limita o bitrate em 4 Mbps — útil para streaming onde a banda é limitada.
Comparação de codecs: H.264 vs H.265 vs VP9 vs AV1
Escolher o codec certo é trade-off entre eficiência de compressão, velocidade de encoding, e compatibilidade de playback.
Eficiência de compressão
Em qualidade visual equivalente (VMAF 95), tamanhos relativos:
| Codec | Tamanho relativo | Compressão vs H.264 |
|---|---|---|
| H.264 (libx264) | 100% | Baseline |
| H.265 (libx265) | 55-65% | 35-45% menor |
| VP9 (libvpx-vp9) | 55-65% | 35-45% menor |
| AV1 (libaom-av1) | 40-50% | 50-60% menor |
Velocidade de encoding
Tempo relativo de encoding para fonte 1080p 60fps em qualidade equivalente:
| Codec | Tempo de encoding (relativo) | Notas |
|---|---|---|
| H.264 | 1x | Rápido, bem otimizado |
| H.265 | 3-5x | Significativamente mais lento |
| VP9 | 5-10x | Muito lento (single-thread por padrão) |
| AV1 (libaom) | 20-50x | Extremamente lento |
| AV1 (SVT-AV1) | 3-8x | Implementação AV1 muito mais rápida |
Compatibilidade de playback (2026)
| Codec | Browsers | Mobile | Smart TVs | Decode em hardware |
|---|---|---|---|---|
| H.264 | 99%+ | 99%+ | 99%+ | Universal |
| H.265 | Safari, Edge (parcial) | iOS, Android 5+ | Maioria moderna | Comum |
| VP9 | Chrome, Firefox, Edge | Android 5+ | Limitado | Crescendo |
| AV1 | Chrome, Firefox, Edge, Safari 17+ | Celulares topo de linha | Limitado | Emergente |
Comandos práticos
# H.264 — maximum compatibility
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4
# H.265 — 40% smaller, good mobile support
ffmpeg -i input.mp4 -c:v libx265 -crf 28 -preset medium -c:a aac -b:a 128k output.mp4
# VP9 — royalty-free, good for web
ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 -row-mt 1 -c:a libopus -b:a 128k output.webm
# AV1 (SVT-AV1) — best compression, modern devices
ffmpeg -i input.mp4 -c:v libsvtav1 -crf 30 -preset 6 -c:a libopus -b:a 128k output.mp4
Qual codec escolher
| Cenário | Codec recomendado | Por quê |
|---|---|---|
| Compatibilidade máxima | H.264 | Toca em todo lugar |
| Economia de banda, ecossistema Apple | H.265 | Boa compressão, nativo iOS/macOS |
| Web-first, royalty-free | VP9 | Suporte Chrome/Firefox, sem licenciamento |
| À prova de futuro, melhor compressão | AV1 (SVT-AV1) | 50%+ economia, suporte crescendo |
| Audiência mista | H.264 com fallback H.265/AV1 | Sirva o melhor codec por dispositivo |
Para mais detalhes sobre conversão entre containers, veja nosso guia de conversão de formato de vídeo.
Boas práticas de scaling de resolução
Fazer downscale de vídeo direito envolve mais que só mudar a resolução.
Resoluções alvo comuns
| Nome | Resolução | Bitrate típico (H.264) | Bitrate típico (H.265) |
|---|---|---|---|
| 4K UHD | 3840x2160 | 15-30 Mbps | 8-15 Mbps |
| 1440p | 2560x1440 | 8-15 Mbps | 4-8 Mbps |
| 1080p Full HD | 1920x1080 | 4-8 Mbps | 2-4 Mbps |
| 720p HD | 1280x720 | 2-4 Mbps | 1-2 Mbps |
| 480p SD | 854x480 | 1-2 Mbps | 0.5-1 Mbps |
| 360p | 640x360 | 0.5-1 Mbps | 0.3-0.5 Mbps |
Scaling preservando aspect ratio
Sempre use -1 numa dimensão para manter o aspect ratio, e use -2 para garantir que o valor seja divisível por 2 (exigido pela maioria dos codecs):
# Scale to 720p width, auto-calculate height (divisible by 2)
ffmpeg -i input.mp4 -vf "scale=1280:-2" -c:v libx264 -crf 23 output.mp4
# Scale to 1080 height, auto-calculate width
ffmpeg -i input.mp4 -vf "scale=-2:1080" -c:v libx264 -crf 23 output.mp4
Qualidade do filtro de scaling
O FFmpeg oferece múltiplos algoritmos de scaling. O padrão (bilinear) é tranquilo na maioria dos casos, mas para a melhor qualidade no downscale, use Lanczos:
# High-quality downscale with Lanczos
ffmpeg -i input.mp4 -vf "scale=1280:720:flags=lanczos" -c:v libx264 -crf 23 output.mp4
| Algoritmo | Velocidade | Qualidade no downscale | Melhor para |
|---|---|---|---|
| fast_bilinear | Mais rápido | Baixa | Processamento em tempo real |
| bilinear | Rápido | Moderada | Padrão, uso geral |
| bicubic | Médio | Boa | Necessidades moderadas |
| lanczos | Mais lento | Melhor | Entrega final, qualidade crítica |
| spline | Mais lento | Excelente | Alternativa ao Lanczos |
Não faça upscale
Como regra geral, nunca faça upscale de vídeo. Encodar uma fonte 720p como 1080p desperdiça banda sem adicionar detalhe real. Se você precisa fazer upscale, mantenha mínimo e use Lanczos:
# If you must upscale (avoid when possible)
ffmpeg -i input_720p.mp4 -vf "scale=1920:1080:flags=lanczos" -c:v libx264 -crf 20 output.mp4
Compressão de áudio
Áudio frequentemente é negligenciado em workflows de compressão de vídeo, mas otimizá-lo pode economizar banda significativa.
Configurações de áudio recomendadas
| Caso de uso | Codec | Bitrate | Comando |
|---|---|---|---|
| Vídeo web geral | AAC | 128 kbps | -c:a aac -b:a 128k |
| Vídeo de alta qualidade | AAC | 192 kbps | -c:a aac -b:a 192k |
| Conteúdo focado em música | AAC | 256 kbps | -c:a aac -b:a 256k |
| Vídeo WebM/VP9 | Opus | 128 kbps | -c:a libopus -b:a 128k |
| Podcast/voz | AAC | 64 kbps | -c:a aac -b:a 64k |
| Podcast/voz (Opus) | Opus | 48 kbps | -c:a libopus -b:a 48k |
Normalizando o loudness do áudio
Níveis de áudio inconsistentes entre vídeos é um problema comum. O filtro loudnorm do FFmpeg normaliza para padrões de broadcast:
# Normalize to -16 LUFS (standard for streaming)
ffmpeg -i input.mp4 -c:v copy -af "loudnorm=I=-16:TP=-1.5:LRA=11" -c:a aac -b:a 128k output.mp4
Removendo o áudio
Se você não precisa de áudio:
ffmpeg -i input.mp4 -an -c:v libx264 -crf 23 output.mp4
Copiando o áudio sem re-encode
Se o áudio já está num formato adequado:
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a copy output.mp4
Cenários reais de compressão
Entrega web (uso geral)
O cenário mais comum — comprimir vídeo para embed em sites:
ffmpeg -i input.mp4 \
-c:v libx264 -crf 23 -preset medium \
-vf "scale=1920:1080:flags=lanczos" \
-c:a aac -b:a 128k \
-movflags +faststart \
output.mp4
Detalhes-chave:
-movflags +faststartmove os metadados para o início do arquivo, habilitando playback progressivo (essencial para web)- CRF 23 dá um bom equilíbrio entre qualidade e tamanho
- AAC 128k é suficiente para a maior parte do conteúdo web
Otimização para redes sociais
Plataformas como Twitter/X, Instagram e TikTok têm requisitos específicos:
# Optimized for social platforms (H.264, AAC, fast start)
ffmpeg -i input.mp4 \
-c:v libx264 -crf 23 -preset medium \
-profile:v high -level:v 4.0 \
-pix_fmt yuv420p \
-vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2" \
-c:a aac -b:a 128k -ar 44100 \
-movflags +faststart \
output.mp4
-profile:v high -level:v 4.0garante compatibilidade ampla-pix_fmt yuv420pgarante playback em todos os dispositivos- O filtro
scale+padcria um vídeo vertical 9:16 com letterboxing
Arquivamento (qualidade máxima, perda mínima)
Para storage de longo prazo onde tamanho importa menos:
ffmpeg -i input.mp4 \
-c:v libx264 -crf 16 -preset slow \
-c:a flac \
output.mkv
- CRF 16 preserva praticamente todo o detalhe visual
- Áudio FLAC é lossless
- O container MKV suporta mais codecs que MP4
Streaming (bitrate adaptativo com HLS)
Gerando múltiplos níveis de qualidade para streaming adaptativo:
ffmpeg -i input.mp4 \
-map 0:v -map 0:a -map 0:v -map 0:a -map 0:v -map 0:a \
-c:v libx264 -crf 22 \
-c:a aac -b:a 128k \
-var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2" \
-b:v:0 5M -maxrate:v:0 5.5M -bufsize:v:0 10M -s:v:0 1920x1080 \
-b:v:1 2.5M -maxrate:v:1 2.75M -bufsize:v:1 5M -s:v:1 1280x720 \
-b:v:2 1M -maxrate:v:2 1.1M -bufsize:v:2 2M -s:v:2 854x480 \
-f hls -hls_time 6 -hls_list_size 0 \
-master_pl_name master.m3u8 \
stream_%v/playlist.m3u8
Script de compressão em lote
Para processar um diretório inteiro de vídeos:
#!/bin/bash
# 批量压缩目录下所有视频
for f in *.mp4; do
ffmpeg -i "$f" \
-c:v libx264 -crf 23 -preset medium \
-c:a aac -b:a 128k \
-movflags +faststart \
"compressed_${f}"
done
Compressão na cloud com FFHub
Todos os comandos deste guia funcionam direto com FFHub.io — só mande via API:
# Compress a video in the cloud (no local FFmpeg needed)
curl -X POST https://api.ffhub.io/v1/tasks \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"command": "ffmpeg -i https://example.com/input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k -movflags +faststart output.mp4"
}'
Isso joga o trabalho pesado de encoding (CPU-intensive) para a cloud, deixando sua máquina ou servidor livre. Particularmente útil para transcodificação em lote ou quando rodar FFmpeg no seu servidor de aplicação afetaria a performance.
Cheat sheet de referência rápida
Comandos de uma linha
# Good default compression
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a aac -b:a 128k -movflags +faststart output.mp4
# Aggressive compression (smaller file)
ffmpeg -i input.mp4 -c:v libx264 -crf 28 -preset fast -c:a aac -b:a 96k output.mp4
# High-quality compression (larger file)
ffmpeg -i input.mp4 -c:v libx264 -crf 18 -preset slow -c:a aac -b:a 192k output.mp4
# Maximum compression with H.265
ffmpeg -i input.mp4 -c:v libx265 -crf 28 -preset medium -c:a aac -b:a 128k output.mp4
# Future-proof with AV1
ffmpeg -i input.mp4 -c:v libsvtav1 -crf 30 -preset 6 -c:a libopus -b:a 128k output.mp4
Árvore de decisão
- Precisa de compatibilidade máxima? Use H.264
- Precisa de arquivos menores? Use H.265 (Apple/mobile) ou VP9 (web)
- Precisa dos menores arquivos e tem tempo? Use AV1
- Precisa de tamanho específico? Use two-pass encoding
- Precisa de qualidade consistente? Use CRF
- Processando muitos arquivos? Use preset
fastouveryfast - Processando um arquivo importante? Use preset
slow
Conclusão
Compressão de vídeo eficaz se resume a entender e equilibrar três fatores: qualidade (CRF), velocidade (preset), e tamanho (escolha de codec). Comece com os padrões — CRF 23, preset medium, H.264 — e ajuste com base nos seus requisitos específicos. Teste com seu conteúdo real, porque o comportamento de compressão varia drasticamente entre vídeos talking-head e sequências de ação.
Os comandos deste guia são FFmpeg padrão — eles vão funcionar na sua máquina local, em qualquer servidor, ou através de um serviço cloud como o FFHub. Domine esses fundamentos e você vai dar conta de qualquer desafio de compressão de vídeo que aparecer.
Valide uma combinação CRF / preset / codec em um clipe real antes de plugar no seu pipeline. Mesmas flags do FFmpeg, sem instalar nada.
Perguntas Frequentes (FAQ)
Qual CRF usar para vídeo em streaming?
Para streaming adaptativo HLS / DASH, o padrão é CRF 21–23 com tetos de -maxrate e -bufsize. CRF mantém a qualidade consistente entre mudanças de complexidade, enquanto o teto de bitrate protege contra picos de banda do espectador. Use CRF 23 pra variante de maior qualidade, CRF 24–25 pra qualidade média, CRF 26–28 pra a menor.
Two-pass vs CRF: quando usar cada um?
Use CRF quando você se importa com qualidade consistente (qualquer workflow web ou de arquivamento). Use two-pass quando você precisa atingir uma dimensão específica (limite de 25MB do Discord, especificação de broadcast, spec de anúncio). Two-pass leva ~2x mais que CRF mas dá controle preciso de tamanho. Pra streaming com teto de bitrate mas comportamento priorizando qualidade, combine CRF com -maxrate e -bufsize.
Por que H.265 demora tanto mais que H.264?
H.265 avalia muito mais tamanhos de bloco, modos de predição e vetores de movimento por quadro pra alcançar sua vantagem de compressão de 30–40%. A spec HEVC é intencionalmente mais complexa que a do H.264 em troca dessa eficiência. Mundo real: H.265 com libx265 -preset medium é cerca de 3–5x mais lento que H.264 com libx264 -preset medium pra a mesma saída de qualidade.
AV1 está pronto pra uso em produção em 2026?
Sim pra entrega, com ressalvas. Decodificadores AV1 em hardware agora são comuns em celulares topo de linha, consoles da geração atual e Apple Silicon, mas dispositivos antigos ainda precisam de fallback H.264. Pra encoding, SVT-AV1 (libsvtav1) é a escolha prática — 3–8x mais lento que H.264 em qualidade equivalente, contra 20–50x mais lento pra libaom-av1. Netflix, YouTube e Vimeo já servem AV1 a clientes capazes.
Como comprimir vídeos em lote mantendo qualidade consistente entre fontes diferentes?
Use modo CRF, não modo bitrate — CRF se adapta à complexidade de cada fonte. Um loop shell simples com -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k -movflags +faststart produz qualidade percebida uniforme entre entradas misturadas. Se você também precisa de teto rígido de tamanho, sobreponha -maxrate e -bufsize (por exemplo, -maxrate 4M -bufsize 8M).
-preset slow realmente deixa arquivos menores?
Sim, mas com retornos decrescentes. De medium → slow você economiza ~6% de tamanho na mesma qualidade, mas a codificação leva ~70% mais. medium → veryslow economiza ~14% por 6.4x o tempo de encode. placebo é virtualmente idêntico a veryslow — não use placebo. Pontos ideais práticos: medium (padrão), slow (lotes noturnos, entrega final), fast (workflows tempo real ou proxy).
Artigos relacionados
- Como comprimir vídeo com FFmpeg - Um guia amigável para reduzir o tamanho de arquivo de vídeo com FFmpeg
- Como converter formato de vídeo com FFmpeg - Troque entre MP4, MKV, WebM e outros containers com controle de codec
- API de transcodificação em lote - Automatize compressão de vídeo em larga escala via cloud API