Communitygithub.com

aminmzadev/ffmpeg-pipeline

Transforme imagens estáticas em vídeo e faça cirurgias de mídia a partir do shell — efeito Ken Burns, crossfades, mixagem de narração, folhas de contato, extração de quadros, GIFs, normalização de loudness e alterações de velocidade. Use quando o usuário quiser um vídeo, slideshow, clipe de pré-visualização, folha de contato de um vídeo ou precisar combinar, cortar ou normalizar áudio e vídeo.

O que é ffmpeg-pipeline?

Esta skill (ffmpeg-pipeline) é uma ferramenta versátil para agentes de IA que precisam manipular mídia diretamente do shell. Ela permite transformar imagens estáticas em vídeos MP4 com movimento estilo Ken Burns (zoompan) e crossfades, além de oferecer uma ampla gama de comandos para edição de áudio e vídeo, como mixagem de narração, extração de quadros, criação de GIFs otimizados, normalização de loudness e alteração de velocidade sem distorção de tom. A skill suporta plataformas de terminal Unix-like (Linux, macOS) e depende do ffmpeg e ffprobe. Ela também se integra opcionalmente com skills irmãs 'anon-image' (para geração de imagens) e 'anon-audio' (para narração), mas aceita entradas fornecidas diretamente via argumentos de linha de comando. Documentação completa com tabelas de comandos, regras de decisão para proporção de tela, duração dos takes e modos de falha é apresentada no formato SKILL.md, garantindo que o agente possa usar a ferramenta de forma confiável. A skill é ideal para automatizar a criação de vídeos para redes sociais, YouTube, apresentações ou qualquer cenário onde processamento de mídia seja necessário.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/aminmzadev/keyless-agent-skills/tree/main/ffmpeg-pipeline

Perguntar na sua IA favorita

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

Documentação

O que ffmpeg-pipeline faz?

A skill de cola. Ela transforma imagens geradas (ou fornecidas) em um MP4 animado com narração, e faz as tarefas comuns de mídia que um agente encontra constantemente.

Requer ffmpeg + ffprobe. Precisa de anon-image para modo prompt e anon-audio para --narration; ambos são descobertos automaticamente como irmãos, e ambos são opcionais se você passar --images / --audio no lugar.

Comandos

ComandoO que faz
videoimagens estáticas (geradas ou de --images) → MP4 com movimento zoompan + crossfades, narração e fundo musical opcionais
slideshowimagens existentes → MP4
muxanexar uma faixa de áudio a um vídeo, repetindo/preenchendo para caber
framesextrair quadros a cada N segundos
sheetfolha de contato (N quadros espaçados uniformemente com carimbos de tempo)
gifGIF otimizado em paleta, recortado, de qualquer seção
normalizenormalizar loudness do áudio para −16 LUFS
speedalterar velocidade do áudio sem distorção de tom (atempo em cadeia)
inforesumo de uma linha do ffprobe
probeverificação de dependências

Início rápido

# todo o pipeline em uma chamada: 3 takes gerados, 4 s cada, narrados
vidkit.py video "um farol em um penhasco de basalto ao entardecer, cinematográfico" -o story.mp4 \
  --shots 3 --seconds 4 --ratio 16:9 \
  --narration "Em algum lugar em uma costa fria, um farol mantém sua vigília." \
  --voice en-GB-RyanNeural

# reutilizar imagens que você já tem
vidkit.py video --images shots/ -o out.mp4 --seconds 3 --music bed.mp3

# cirurgia de mídia
vidkit.py mux clip.mp4 voiceover.mp3 -o final.mp4
vidkit.py sheet final.mp4 -o preview.jpg --cols 4 --count 8
vidkit.py gif final.mp4 -o teaser.gif --start 1 --dur 2.5 --width 480
vidkit.py normalize voiceover.mp3 -o clean.mp3
vidkit.py info final.mp4

Matemática de tempo (para você prever a saída)

Com N takes de S segundos e um crossfade de 0,8 s:

duração = N*S - (N-1)*0,8

3 × 4 s → 10,4 s. Se a narração for mais longa que a imagem, o vídeo repete para cobri-la (-stream_loop). Se for mais curta, o áudio é preenchido com silêncio para que você nunca perca o final. Ambos os casos são tratados — não adicione -shortest você mesmo.

Regras de decisão

  • Proporção: 16:9 para YouTube/web, 9:16 para Shorts/Reels/TikTok, 1:1 para feeds e miniaturas. Tudo é redimensionado para cobrir e depois cortado, então imagens de origem de qualquer formato sobrevivem sem letterbox.
  • Segundos por take: 3–4 s é adequado para uma imagem estática; mais de 6 s de uma imagem estática parece morto. Se precisar de mais tempo de execução, adicione takes, não segundos.
  • Fundo musical: passe --music e ele será mixado a 12% abaixo da voz. Não misture duas fontes altas; normalize primeiro.
  • GIF: mantenha largura ≤ 480 e duração ≤ 3 s ou o arquivo excede os limites do chat.

Modos de falha

SintomaCausaCorreção
missing dependency: ffmpegnão instaladoapt install ffmpeg (ou brew install ffmpeg)
ffmpeg failed: … Invalid argument no zoompandimensões ímpares da origemo filtro já redimensiona para W*2; se você o editou, mantenha números pares
saída silenciosaarquivo de narração ausente/vazioverifique o caminho; --narration aceita texto ou um caminho de áudio
saída muito mais curta que o esperadoáudio mais curto que o vídeo e algo adicionou -shortestremova-o; vidkit.py preenche como alternativa
contact sheet needs Pillowsem Pillowpip install pillow, ou use frames + sua própria folha

Notas para o agente

  • Renderize em 720p a menos que o usuário peça mais. É 4× mais rápido e ninguém percebe em uma tela de laptop.
  • Sempre execute info no artefato final e cite a duração real, resolução e tamanho de volta para o usuário — isso detecta falhas silenciosas.
  • Entregue o caminho do MP4; não incorpore. O arquivo é o artefato.

Habilidades Relacionadas