FFmpeg Essenciais
Sempre sondar primeiro, nunca sobrescrever a entrada, e recompactar ao cortar, a menos que instruído de outra forma.
Sondagem
# Resumo humano
ffprobe -v error -show_entries stream=codec_type,codec_name,width,height,r_frame_rate,sample_rate -show_entries format=duration,size -of default=nw=1 input.mp4
# Legível por máquina
ffprobe -v quiet -print_format json -show_format -show_streams input.mp4
Corte
# Iniciar aos 30 s, manter 15 s. Recompactar: preciso e seguro.
ffmpeg -i input.mp4 -ss 00:00:30 -t 15 -c:v libx264 -crf 20 -c:a aac out/clip.mp4
# Rápido, sem recompactar. Apenas em keyframes, portanto o início pode estar com segundos de diferença.
ffmpeg -ss 00:00:30 -i input.mp4 -t 15 -c copy out/clip.mp4
-ss antes de -i busca rapidamente. Após -i, busca com precisão, mas mais lentamente. Para recompactações, qualquer um é aceitável no FFmpeg moderno.
Junção
# Mesmo codec, resolução, fps: instantâneo, sem perdas
printf "file 'a.mp4'\nfile 'b.mp4'\n" > list.txt
ffmpeg -f concat -safe 0 -i list.txt -c copy out/joined.mp4
# Fontes diferentes: normalizar durante a junção
ffmpeg -i a.mp4 -i b.mp4 -filter_complex \
"[0:v]scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,fps=30,setsar=1[v0];\
[1:v]scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,fps=30,setsar=1[v1];\
[0:a][1:a]concat=n=2:v=1:a=1[v][a]" \
-map "[v]" -map "[a]" -c:v libx264 -crf 20 -c:a aac out/joined.mp4
PowerShell: escreva list.txt com Set-Content e use acento grave para continuação de linha ou uma única linha longa em vez de \.
Redimensionar e reenquadrar
# Ajustar dentro de 1920x1080 com barras
-vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2"
# Preencher 1920x1080, cortar excesso
-vf "scale=1920:1080:force_original_aspect_ratio=increase,crop=1920:1080"
# Largura 1280, altura automática e par
-vf "scale=1280:-2"
Comprimir
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k -movflags +faststart out/small.mp4
| Finalidade | CRF | Preset |
|---|---|---|
| Master / arquivo | 16-18 | slow |
| Produção | 20-22 | medium |
| Web / pré-visualização | 23-26 | fast |
| Rascunho rápido | 28+ | veryfast |
CRF menor significa maior qualidade e arquivo maior. Para um tamanho alvo, use -b:v de duas passagens em vez de CRF.
Velocidade
# 2x mais rápido, vídeo e áudio
ffmpeg -i in.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" out/fast.mp4
# 0.5x câmera lenta
ffmpeg -i in.mp4 -filter_complex "[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]" -map "[v]" -map "[a]" out/slow.mp4
# Apenas vídeo
ffmpeg -i in.mp4 -an -filter:v "setpts=0.25*PTS" out/timelapse.mp4
O multiplicador setpts = 1 / velocidade. atempo aceita de 0,5 a 2,0 por filtro, então encadeie para mais: atempo=2.0,atempo=2.0 para 4x.
Fades
# 1 s de entrada, 1 s de saída em um clipe de 10 s
ffmpeg -i in.mp4 -vf "fade=t=in:st=0:d=1,fade=t=out:st=9:d=1" -af "afade=t=in:st=0:d=1,afade=t=out:st=9:d=1" out/faded.mp4
Áudio
ffmpeg -i in.mp4 -vn -c:a libmp3lame -q:a 2 out/audio.mp3 # extrair mp3
ffmpeg -i in.mp4 -vn -c:a copy out/audio.m4a # extrair sem recompactar (fonte AAC)
ffmpeg -i video.mp4 -i voice.wav -map 0:v -map 1:a -c:v copy -c:a aac -shortest out/dubbed.mp4 # substituir áudio
ffmpeg -i in.mp4 -an -c:v copy out/silent.mp4 # remover áudio
GIF
ffmpeg -i in.mp4 -t 5 -vf "fps=15,scale=480:-1:flags=lanczos,split[a][b];[a]palettegen[p];[b][p]paletteuse" out/preview.gif
Imagens
ffmpeg -ss 5 -i in.mp4 -frames:v 1 -q:v 2 out/frame.jpg # um quadro
ffmpeg -framerate 30 -i frames/%04d.png -c:v libx264 -pix_fmt yuv420p out/from-frames.mp4
ffmpeg -loop 1 -i still.png -t 5 -c:v libx264 -pix_fmt yuv420p -r 30 out/still.mp4
Solução de problemas
| Sintoma | Correção |
|---|---|
height not divisible by 2 | Adicione scale=trunc(iw/2)*2:trunc(ih/2)*2 |
| Reproduz no VLC, mas não no navegador ou celular | -c:v libx264 -pix_fmt yuv420p -movflags +faststart |
| Áudio dessincroniza após alteração de velocidade | Use setpts e atempo juntos em filter_complex |
| Áudio dessincroniza em clipes de celular com taxa de quadros variável | Adicione -vsync cfr -r 30 (ou -fps_mode cfr) |
Primeiros quadros pretos após corte com -c copy | Recompacte em vez de copiar o stream |
| Saída tem 0 bytes | Leia o erro completo com -v error; verifique o mapeamento de streams |
| Caminhos com espaços | Coloque entre aspas: "my clip.mp4" |
| Prompt de sobrescrita bloqueia automação | Adicione -y (sobrescrever) ou -n (nunca) |
Hábitos de segurança
- Escreva em
out/, nunca no caminho de entrada. - Adicione
-hide_banner -loglevel errorem scripts,-statspara ver o progresso. - Verifique o resultado com
ffprobee a skillvideo-qa.