FFmpeg para Produção de Vídeo
FFmpeg é a ferramenta essencial para processamento de vídeo/áudio. Este skill cobre operações comuns para projetos de vídeo no Remotion.
Referência Rápida
GIF para MP4 (Compatível com Remotion)
ffmpeg -i input.gif -movflags faststart -pix_fmt yuv420p \
-vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" output.mp4
Por que essas flags:
-movflags faststart- Move os metadados para o início para streaming na web-pix_fmt yuv420p- Garante compatibilidade com a maioria dos playersscale=trunc(...)- Força dimensões pares (exigido pela maioria dos codecs)
Redimensionar Vídeo
# Para 1920x1080 (manter proporção, adicionar barras pretas)
ffmpeg -i input.mp4 -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2" output.mp4
# Para 1920x1080 (cortar para preencher)
ffmpeg -i input.mp4 -vf "scale=1920:1080:force_original_aspect_ratio=increase,crop=1920:1080" output.mp4
# Redimensionar pela largura, altura automática
ffmpeg -i input.mp4 -vf "scale=1280:-2" output.mp4
Comprimir Vídeo
# Boa qualidade, arquivo menor (CRF 23 é o padrão, menor = melhor qualidade)
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4
# Compressão agressiva para preview na web
ffmpeg -i input.mp4 -c:v libx264 -crf 28 -preset fast -c:a aac -b:a 96k output.mp4
# Tamanho de arquivo alvo (ex.: ~10MB para 60s de vídeo = ~1,3Mbps)
ffmpeg -i input.mp4 -c:v libx264 -b:v 1300k -c:a aac -b:a 128k output.mp4
Extrair Áudio
# Extrair para MP3
ffmpeg -i input.mp4 -vn -acodec libmp3lame -q:a 2 output.mp3
# Extrair para AAC
ffmpeg -i input.mp4 -vn -acodec aac -b:a 192k output.m4a
# Extrair para WAV (sem compressão)
ffmpeg -i input.mp4 -vn output.wav
Converter Formatos de Áudio
# M4A para MP3 (para amostras de voz ElevenLabs)
ffmpeg -i input.m4a -codec:a libmp3lame -qscale:a 2 output.mp3
# WAV para MP3
ffmpeg -i input.wav -codec:a libmp3lame -b:a 192k output.mp3
# Ajustar volume
ffmpeg -i input.mp3 -filter:a "volume=1.5" output.mp3
Cortar Vídeo
# Cortar a partir de um timestamp por duração (recomendado - confiável)
ffmpeg -i input.mp4 -ss 00:00:30 -t 00:00:15 -c:v libx264 -c:a aac output.mp4
# Cortar de timestamp para timestamp
ffmpeg -i input.mp4 -ss 00:00:30 -to 00:00:45 -c:v libx264 -c:a aac output.mp4
# Cópia de stream (mais rápido, mas pode perder frames nos pontos de corte)
# Use apenas quando a origem tiver keyframes frequentes
ffmpeg -i input.mp4 -ss 00:00:30 -t 00:00:15 -c copy output.mp4
Nota: A re-codificação é recomendada para cortes. A cópia de stream (-c copy) pode descartar vídeo silenciosamente se o ponto de busca não coincidir com um keyframe.
Acelerar / Desacelerar
# Velocidade 2x (vídeo e áudio)
ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mp4
# Velocidade 0.5x (câmera lenta)
ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]" -map "[v]" -map "[a]" output.mp4
# Apenas vídeo (sem áudio)
ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" -an output.mp4
Concatenar Vídeos
# Criar lista de arquivos
echo "file 'clip1.mp4'" > list.txt
echo "file 'clip2.mp4'" >> list.txt
echo "file 'clip3.mp4'" >> list.txt
# Concatenar (mesmo codec/resolução)
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4
# Concatenar com re-codificação (fontes diferentes)
ffmpeg -f concat -safe 0 -i list.txt -c:v libx264 -c:a aac output.mp4
Adicionar Fade In/Out
# Fade in no primeiro 1 segundo, fade out no último 1 segundo (vídeo 30fps)
ffmpeg -i input.mp4 -vf "fade=t=in:st=0:d=1,fade=t=out:st=9:d=1" -c:a copy output.mp4
# Fade de áudio
ffmpeg -i input.mp4 -af "afade=t=in:st=0:d=1,afade=t=out:st=9:d=1" -c:v copy output.mp4
Obter Informações do Vídeo
# Duração, resolução, informações do codec
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4
# Informações completas
ffprobe -v quiet -print_format json -show_format -show_streams input.mp4
Padrões Específicos para Remotion
Ajuste de Velocidade de Vídeo para Remotion
Quando usar FFmpeg vs playbackRate do Remotion:
| Cenário | Usar FFmpeg | Usar Remotion |
|---|---|---|
| Velocidade constante (1,5x, 2x) | Qualquer um funciona | ✅ Mais simples |
| Velocidades extremas (>4x ou <0,25x) | ✅ Mais confiável | Pode ter problemas |
| Velocidade variável (acelerar ao longo do tempo) | ✅ Pré-processar | Solução complexa necessária |
| Necessita sincronização de áudio perfeita | ✅ Garantido | Geralmente ok |
| Demo precisa se ajustar ao timing da narração | ✅ Pré-calcular | Ajuste em tempo de execução |
Limitação do Remotion: playbackRate deve ser constante. Interpolação dinâmica como playbackRate={interpolate(frame, [0, 100], [1, 5])} não funcionará corretamente porque o Remotion avalia os frames independentemente.
# Acelerar demo para caber em uma cena (ex.: 60s demo em 20s = velocidade 3x)
ffmpeg -i demo-raw.mp4 \
-filter_complex "[0:v]setpts=0.333*PTS[v];[0:a]atempo=3.0[a]" \
-map "[v]" -map "[a]" \
public/demos/demo-fast.mp4
# Câmera lenta para ênfase (velocidade 0,5x)
ffmpeg -i action.mp4 \
-filter_complex "[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]" \
-map "[v]" -map "[a]" \
public/demos/action-slow.mp4
# Acelerar sem áudio (comum para gravações de tela)
ffmpeg -i demo.mp4 -filter:v "setpts=0.5*PTS" -an public/demos/demo-2x.mp4
# Efeito timelapse (velocidade 10x, descartar áudio)
ffmpeg -i long-demo.mp4 -filter:v "setpts=0.1*PTS" -an public/demos/timelapse.mp4
Calcular fator de velocidade:
- Para caber X segundos de vídeo em Y segundos de cena:
velocidade = X / Y - Multiplicador setpts =
1 / velocidade(ex.: velocidade 3x = setpts=0.333*PTS) - Valor atempo =
velocidade(ex.: velocidade 3x = atempo=3.0)
Velocidade extrema (>2x áudio): Encadear filtros atempo (cada um limitado ao intervalo 0,5-2,0):
# Áudio com velocidade 4x
-filter_complex "[0:a]atempo=2.0,atempo=2.0[a]"
# Áudio com velocidade 8x
-filter_complex "[0:a]atempo=2.0,atempo=2.0,atempo=2.0[a]"
Preparar Gravação de Demo para Remotion
# 1080p padrão, 30fps, pronto para Remotion
ffmpeg -i raw-recording.mp4 \
-vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,fps=30" \
-c:v libx264 -crf 18 -preset slow \
-c:a aac -b:a 192k \
-movflags faststart \
public/demos/demo.mp4
Gravação de Tela para Asset Remotion
# De gravação de iPhone/iPad (geralmente 60fps, resolução variável)
ffmpeg -i iphone-recording.mov \
-vf "scale=1920:-2,fps=30" \
-c:v libx264 -crf 20 \
-an \
public/demos/mobile-demo.mp4
Converter GIFs em Lote
for f in assets/*.gif; do
ffmpeg -i "$f" -movflags faststart -pix_fmt yuv420p \
-vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" \
"public/demos/$(basename "$f" .gif).mp4"
done
Problemas Comuns
"Height not divisible by 2"
Adicione o filtro scale: -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2"
O vídeo não reproduz no navegador
Use: -movflags faststart -pix_fmt yuv420p -c:v libx264
Áudio fora de sincronia após alteração de velocidade
Use filter_complex com atempo: -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]"
Arquivo muito grande
Aumente o CRF (23→28) ou reduza a resolução
Diretrizes de Qualidade
| Caso de Uso | CRF | Preset | Notas |
|---|---|---|---|
| Arquivo/Master | 18 | slow | Melhor qualidade, arquivos grandes |
| Produção | 20-22 | medium | Bom equilíbrio |
| Web/Preview | 23-25 | fast | Arquivos menores |
| Rascunho/Rápido | 28+ | veryfast | Codificação rápida |
Otimização de Saída por Plataforma
Após o Remotion renderizar seu vídeo (normalmente para out/video.mp4), use o FFmpeg para otimizar para cada plataforma de distribuição.
Integração no Fluxo de Trabalho
Render Remotion (master) Otimização FFmpeg Upload para plataforma
↓ ↓ ↓
out/video.mp4 ────────→ out/video-youtube.mp4 ───→ YouTube
────────→ out/video-twitter.mp4 ───→ Twitter/X
────────→ out/video-linkedin.mp4 ───→ LinkedIn
────────→ out/video-web.mp4 ───→ Incorporar no site
YouTube (Configurações Recomendadas)
O YouTube re-codifica tudo, então faça upload com alta qualidade:
# Otimizado para YouTube (1080p)
ffmpeg -i out/video.mp4 \
-c:v libx264 -preset slow -crf 18 \
-profile:v high -level 4.0 \
-bf 2 -g 30 \
-c:a aac -b:a 192k -ar 48000 \
-movflags +faststart \
out/video-youtube.mp4
# YouTube Shorts (vertical 1080x1920)
ffmpeg -i out/video.mp4 \
-vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2" \
-c:v libx264 -crf 18 -c:a aac -b:a 192k \
out/video-shorts.mp4
Twitter/X
O Twitter/X tem limites rigorosos: máx. 140s, 512MB, 1920x1200:
# Otimizado para Twitter (menos de 15MB para upload rápido)
ffmpeg -i out/video.mp4 \
-c:v libx264 -preset medium -crf 24 \
-profile:v main -level 3.1 \
-vf "scale='min(1280,iw)':'min(720,ih)':force_original_aspect_ratio=decrease" \
-c:a aac -b:a 128k -ar 44100 \
-movflags +faststart \
-fs 15M \
out/video-twitter.mp4
# Verificar tamanho e duração do arquivo
ffprobe -v error -show_entries format=duration,size -of csv=p=0 out/video-twitter.mp4
O LinkedIn prefere MP4 com áudio AAC, máx. 10 minutos:
# Otimizado para LinkedIn
ffmpeg -i out/video.mp4 \
-c:v libx264 -preset medium -crf 22 \
-profile:v main \
-vf "scale='min(1920,iw)':'min(1080,ih)':force_original_aspect_ratio=decrease" \
-c:a aac -b:a 192k -ar 48000 \
-movflags +faststart \
out/video-linkedin.mp4
Site/Incorporação (Otimizado para Carregamento Rápido)
# MP4 otimizado para web (arquivo pequeno, carregamento progressivo)
ffmpeg -i out/video.mp4 \
-c:v libx264 -preset medium -crf 26 \
-profile:v baseline -level 3.0 \
-vf "scale=1280:720" \
-c:a aac -b:a 128k \
-movflags +faststart \
out/video-web.mp4
# Alternativa WebM (melhor compressão, suporte mais amplo a navegadores)
ffmpeg -i out/video.mp4 \
-c:v libvpx-vp9 -crf 30 -b:v 0 \
-vf "scale=1280:720" \
-c:a libopus -b:a 128k \
-deadline good \
out/video-web.webm
GIF (para Previews/Miniaturas)
# GIF de alta qualidade (primeiros 5 segundos)
ffmpeg -i out/video.mp4 -t 5 \
-vf "fps=15,scale=480:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
out/preview.gif
# GIF de arquivo menor
ffmpeg -i out/video.mp4 -t 3 \
-vf "fps=10,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
out/preview-small.gif
Referência Rápida de Requisitos por Plataforma
| Plataforma | Resolução Máx. | Tamanho Máx. | Duração Máx. | Áudio |
|---|---|---|---|---|
| YouTube | 8K | 256GB | 12 horas | AAC 48kHz |
| Twitter/X | 1920x1200 | 512MB | 140s | AAC 44,1kHz |
| 4096x2304 | 5GB | 10 min | AAC 48kHz | |
| Instagram Feed | 1080x1350 | 4GB | 60s | AAC 48kHz |
| Instagram Reels | 1080x1920 | 4GB | 90s | AAC 48kHz |
| TikTok | 1080x1920 | 287MB | 10 min | AAC |
Exportação em Lote para Todas as Plataformas
#!/bin/bash
# salvar como: export-all-platforms.sh
INPUT="out/video.mp4"
# YouTube (alta qualidade)
ffmpeg -i "$INPUT" -c:v libx264 -preset slow -crf 18 \
-c:a aac -b:a 192k -movflags +faststart \
out/video-youtube.mp4
# Twitter (comprimido)
ffmpeg -i "$INPUT" -c:v libx264 -crf 24 \
-vf "scale='min(1280,iw)':'-2'" \
-c:a aac -b:a 128k -movflags +faststart \
out/video-twitter.mp4
# LinkedIn
ffmpeg -i "$INPUT" -c:v libx264 -crf 22 \
-c:a aac -b:a 192k -movflags +faststart \
out/video-linkedin.mp4
# Incorporação web (pequeno)
ffmpeg -i "$INPUT" -c:v libx264 -crf 26 \
-vf "scale=1280:720" \
-c:a aac -b:a 128k -movflags +faststart \
out/video-web.mp4
echo "Exportado:"
ls -lh out/video-*.mp4
Tratamento de Erros
Erros comuns e correções ao processar vídeo:
# Verificar se o FFmpeg teve sucesso
ffmpeg -i input.mp4 -c:v libx264 output.mp4 && echo "Sucesso" || echo "Falhou: verifique o arquivo de entrada"
# Validar se o arquivo de saída é reproduzível
ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of csv=p=0 output.mp4
# Obter informações detalhadas de erro
ffmpeg -v error -i input.mp4 -f null - 2>&1 | head -20
Lidando com Falhas Comuns
| Erro | Causa | Correção |
|---|---|---|
| "No such file" | Caminho de entrada incorreto | Verifique o caminho, use aspas para espaços |
| "Invalid data" | Entrada corrompida | Baixe novamente ou regrave a origem |
| "height not divisible by 2" | Dimensões ímpares | Adicione filtro scale com trunc |
| "encoder not found" | Codec ausente | Instale FFmpeg com codecs completos |
| Saída 0 bytes | Falha silenciosa | Verifique a saída completa do ffmpeg para erros |
Feedback e Contribuições
Se este skill estiver faltando informações ou puder ser melhorado:
- Faltando um comando? Descreva o que você precisava
- Encontrou um erro? Informe o que está errado
- Quer contribuir? Posso ajudá-lo a:
- Atualizar este skill com melhorias
- Criar um PR para github.com/digitalsamba/claude-code-video-toolkit
Basta dizer "melhore este skill" e eu guiarei você na atualização de .claude/skills/ffmpeg/SKILL.md.