Communitygithub.com

aelyraAI/ffmpeg

Processamento de vídeo e áudio com FFmpeg. Use para conversão de formatos, redimensionamento, compressão, extração de áudio e preparação de assets para Remotion. Gatilhos incluem converter GIF para MP4, redimensionar vídeo, extrair áudio, comprimir arquivos ou qualquer tarefa de transformação de mídia.

O que é ffmpeg?

Este skill fornece um guia completo e detalhado para usar o FFmpeg no processamento de vídeo e áudio, com foco especial na preparação de assets para projetos de vídeo no Remotion. Ele cobre operações essenciais como conversão de GIF para MP4, redimensionamento, compressão, extração de áudio, corte, aceleração/desaceleração, concatenação e adição de fades. Inclui padrões específicos para Remotion, como ajuste de velocidade com filter_complex, timelapse e preparação de gravações de tela. O skill também oferece otimizações específicas para plataformas de distribuição (YouTube, Twitter/X, LinkedIn, Web e GIF), com parâmetros recomendados de codec, resolução e taxa de bits para cada uma. Por fim, inclui seções de solução de problemas, tratamento de erros e um script de exportação em lote para todas as plataformas, garantindo que desenvolvedores possam integrar o FFmpeg eficientemente em seus fluxos de trabalho de produção de vídeo.

Funciona com✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/aelyraAI/aelyra-skills/tree/HEAD/ffmpeg

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

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 players
  • scale=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árioUsar FFmpegUsar Remotion
Velocidade constante (1,5x, 2x)Qualquer um funciona✅ Mais simples
Velocidades extremas (>4x ou <0,25x)✅ Mais confiávelPode ter problemas
Velocidade variável (acelerar ao longo do tempo)✅ Pré-processarSolução complexa necessária
Necessita sincronização de áudio perfeita✅ GarantidoGeralmente ok
Demo precisa se ajustar ao timing da narração✅ Pré-calcularAjuste 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 UsoCRFPresetNotas
Arquivo/Master18slowMelhor qualidade, arquivos grandes
Produção20-22mediumBom equilíbrio
Web/Preview23-25fastArquivos menores
Rascunho/Rápido28+veryfastCodificaçã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

LinkedIn

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

PlataformaResolução Máx.Tamanho Máx.Duração Máx.Áudio
YouTube8K256GB12 horasAAC 48kHz
Twitter/X1920x1200512MB140sAAC 44,1kHz
LinkedIn4096x23045GB10 minAAC 48kHz
Instagram Feed1080x13504GB60sAAC 48kHz
Instagram Reels1080x19204GB90sAAC 48kHz
TikTok1080x1920287MB10 minAAC

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

ErroCausaCorreção
"No such file"Caminho de entrada incorretoVerifique o caminho, use aspas para espaços
"Invalid data"Entrada corrompidaBaixe novamente ou regrave a origem
"height not divisible by 2"Dimensões ímparesAdicione filtro scale com trunc
"encoder not found"Codec ausenteInstale FFmpeg com codecs completos
Saída 0 bytesFalha silenciosaVerifique 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:
    1. Atualizar este skill com melhorias
    2. 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.

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

Habilidades Relacionadas