Edição de vídeo com ffmpeg
Você é um editor que trabalha com uma transcrição e filtergraphs, em vez de um mouse e uma linha do tempo. O pipeline é determinístico: tudo é editado como texto e reconstruído com um único comando.
footage → transcrição com timings a nível de palavra → EDL (lista de edição) → ffmpeg → vídeo final
↑ ↑
faster-whisper editado à mão — esta É a edição
Princípio fundamental: o vídeo nunca é analisado pixel a pixel — a edição é orientada por texto temporizado. A fala define a estrutura; a imagem a serve.
Um rolo ou muitos?
Decida isso primeiro — isso muda tudo a jusante.
- Um ou dois rolos → siga a ordem dos passos abaixo, de forma conversacional.
- Três ou mais → mude para o pipeline de lote: references/batch-pipeline.md. Cada etapa é executada uma vez sobre todo o projeto e cacheia pelo hash de entrada. Fazer dez rolos conversacionalmente custa aproximadamente dez vezes o contexto e não traz nenhum benefício.
Ordem de trabalho
Sempre siga os passos, nunca pule adiante. Cada passo produz a entrada para o próximo.
- Verifique o ambiente. Se ffmpeg / faster-whisper / Chrome estiverem faltando → references/setup.md. Em uma máquina limpa, isso leva dez minutos.
- Obtenha a origem. Se o usuário passou uma URL em vez de um arquivo, busque-a primeiro com
download.py. - Inspecione a origem — ffprobe, detecção de cena, uma folha de contato. Olhe para os quadros com seus próprios olhos via Read. Nunca edite às cegas apenas a partir do texto.
- Transcreva com timings a nível de palavra e revise o resultado. O reconhecimento de fala erra palavras mesmo em áudio limpo. Sem modelo local?
transcribe_cloud.pyobtém a mesma saída da Groq/OpenAI. - Concorde o conceito com o usuário se ele não especificou um: formato, o que entra nos gráficos, plataforma de destino. Uma pergunta, não um questionário.
- Construa a EDL — corte pausas, nunca corte ideias.
- Construa
base, depois verifique os cortes quadro a quadro. - Gere legendas e sobreposições, construa
final. - Execute a lista de verificação de aceitação e entregue o arquivo com SendUserFile.
Comandos completos para cada passo — references/pipeline.md.
O que este pipeline pode e não pode fazer
Pode: corte semântico, remoção de pausas, close-up nos cortes, correção de cor (incluindo LUTs .cube), legendas a nível de palavra, infográficos arbitrariamente complexos via HTML/CSS, estabilização, normalização de loudness para plataformas sociais, processamento em lote. Com o plugin Remotion instalado, também gráficos animados renderizados a partir de React — veja references/remotion.md.
Não pode de forma alguma — diga isso logo de cara se o usuário pedir: rastreamento de objetos (fixar uma legenda a uma mão em movimento) e correção de cor com máscaras. Isso ainda precisa de Premiere / DaVinci / After Effects.
Não pode sozinho, mas pode com o FableCut instalado: corte criativo com precisão de quadro, movimento com keyframes, transições, rampas de velocidade, chroma key, corte no ritmo musical. FableCut é uma linha do tempo de navegador que um agente controla através de MCP — veja references/fablecut.md. Ele não tem reconhecimento de fala e sua exportação precisa de um clique humano, então a estrutura orientada por fala e os lotes não supervisionados permanecem neste pipeline.
Ferramentas prontas
assets/tools/ contém doze scripts funcionais — copie-os para o projeto, não os reescreva do zero:
| Script | O que faz |
|---|---|
download.py | buscar metragem de origem de uma URL (yt-dlp) — pule se você já tem um arquivo local |
transcribe.py | faster-whisper → transcript.json com timings a nível de palavra + .srt |
transcribe_cloud.py | mesma saída, via API Groq/OpenAI Whisper — sem download de modelo, precisa de uma chave API |
pauses.py | lista pausas na fala — a base para a EDL |
dump_words.py | cada palavra com seu índice e confiança — para revisão |
make_ass.py | legendas ASS a nível de palavra, re-temporizadas para a linha do tempo pós-corte |
render_overlays.py | HTML/CSS → Chrome headless → PNG 1080×1920 com alpha |
build.py | montagem: base (corte + correção), final (sobreposições + legendas + áudio) |
build_vo.py | mesmo, mas para uma faixa de narração separada — vídeo de várias fontes ajustado ao áudio |
batch_vo.py | transcrever toda a narração em uma única carga de modelo |
mute_subs.py | remover legendas onde um cartão de tela cheia está visível |
pipeline.py | driver de lote — cada etapa sobre cada rolo, com cache |
assets/templates/ contém edl.json, overlays.json e corrections.json iniciais.
Organize o projeto assim:
<pasta com a metragem>/
├── IMG_XXXX.MOV
└── edit/
├── tools/ ← os scripts copiados
├── work/ ← intermediários, nunca enviados
├── overlays/ ← PNGs renderizados
├── out/ ← vídeos finalizados
├── edl.json overlays.json corrections.json subs.ass
Arquivos de referência
Carregue-os sob demanda, não todos de uma vez:
- references/setup.md — instalação em uma máquina limpa (Windows/macOS), verificação da compilação do ffmpeg
- references/pipeline.md — o fluxo de trabalho passo a passo, regras de corte, comandos
- references/storyboard.md — formatos de vídeo, tipos de painel, como storyboard de um talking head
- references/design-system.md — paleta, escala tipográfica, zonas seguras, técnicas de sobreposição
- references/batch-pipeline.md — executar muitos rolos como etapas, e para onde o contexto realmente vai
- references/remotion.md — nível de gráficos animados: quando as sobreposições renderizadas em React valem seu custo
- references/fablecut.md — nível de linha do tempo: quando passar a edição para o FableCut, e como os dois pipelines se encontram
- references/ffmpeg-cookbook.md — correções, efeitos, transições, áudio, codificação
- references/troubleshooting.md — leia isso antes da sua primeira execução do ffmpeg; dezessete falhas, cada uma das quais custou uma hora
Regras que fazem ou quebram o vídeo
Aprendidas em construções reais, não da documentação.
- Olhe para os quadros. Uma transcrição não lhe dirá que o orador está se levantando ou arrumando o cabelo naquele exato momento. Esses são precisamente os lugares onde os cortes desmoronam.
- Um cartão vai acima do rosto, nunca sobre ele. A primeira tentativa sempre coloca o painel no meio do quadro, cobrindo os olhos. O olhar do orador é metade da confiança que o vídeo conquista.
- Corte no final de uma frase, não por um cronômetro. Cortar "a cada N segundos" fatia ideias pela metade.
- Deixe 0,2–0,3 s de cada pausa. Uma pausa reduzida a zero soa como uma gagueira.
- Nunca toque em pausas dramáticas — depois de uma pergunta, antes de uma conclusão. Lá o silêncio está fazendo o trabalho.
- Alterne
zoomentre segmentos. Então um corte é lido como uma mudança de ângulo em vez de um erro. - Deixe um trecho sem nenhum gráfico. O espectador precisa de ar; uma parede sólida de cartões é exaustiva.
- Revise as legendas. Um erro de reconhecimento gravado na imagem é permanente.
- Verifique olhando, não pela fé. Extraia quadros, empilhe-os com
hstack, abra o resultado via Read. - Nunca entregue sem a lista de verificação de aceitação em pipeline.md.
- Nunca deixe uma ferramenta escrever de volta em um arquivo de configuração. Um script que acrescenta sua própria saída à EDL dobra o tamanho desse arquivo, e cada edição posterior ecoa tudo no contexto. Dados gerados pertencem a
work/. - Leia a primeira e a última linha da transcrição você mesmo. O Whisper alucina texto fabricado sobre silêncio — classicamente uma linha de crédito de legendagem falsa em áudio russo — e pode carregar uma pontuação de confiança perfeitamente normal. Ambos os scripts de transcrição filtram os casos óbvios automaticamente, mas o filtro não é hermético. Veja troubleshooting.md #17.
Orquestração
A tarefa é de várias etapas — crie tarefas com TaskCreate para os estágios (transcrição, EDL, correção de cor, gráficos, montagem) e mantenha seu status atualizado. Execute operações longas (download de modelo, renderização de base) em segundo plano e use o tempo para trabalho que não depende delas: enquanto o modelo baixa, projete as sobreposições e teste correções em quadros parados.
Entregue o vídeo finalizado com SendUserFile e uma breve nota sobre o que mudou.