FFmpeg Media — Edição Mecânica de Vídeo e Áudio
Esta skill executa uma edição, não decide uma. Corta, junta, mede, sincroniza, exporta e verifica arquivos de mídia — decisões estéticas (o que é "interessante" num highlight, se uma grade parece "cinematográfica", composição de thumbnail) ficam fora de escopo e voltam pro humano ou pra skill de criação correspondente.
Governanca Global
Esta skill segue GLOBAL.md, policies/execution.md, policies/tool-safety.md, policies/verification-before-completion.md, policies/self-correcting-sensors.md e policies/anti-rationalization.md.
Fronteira mecânico vs. subjetivo — o princípio central desta skill: aplicar uma LUT nomeada, cortar em coordenadas exatas, medir loudness em LUFS são operações mecânicas, dentro de escopo. Decidir "essa cor combina com a marca", "esse trecho é o melhor momento do vídeo" ou "isso parece profissional" são julgamentos que pedem contexto humano — a skill relata a medição (waveform, LUFS, duração de cena) e devolve a decisão para quem pediu, nunca decide sozinha e apresenta como fato.
Quando Usar
- cortar, juntar, ou re-sequenciar clipes de vídeo já existentes
- queimar legenda (
.srt) ou overlay de texto/gráfico num vídeo
- normalizar loudness de áudio para o padrão de uma plataforma (Reels, podcast, broadcast)
- detectar e remover silêncio, ou detectar cortes de cena automaticamente
- mudar aspect ratio para o formato de uma plataforma (crop, pad, blur de fundo)
- redigir (borrar/pixelizar) uma região do vídeo — rosto, placa, documento
- sincronizar múltiplas câmeras ou trilha de áudio separada
- extrair metadados, gerar proxy de baixa resolução, ou verificar integridade do arquivo final
- exportar para o preset de uma plataforma específica (loudness, resolução, container corretos)
Quando Nao Usar
- gerar vídeo novo a partir de texto/imagem via IA (text-to-video, image-to-video) — isso é skill 27 (video-integration-specialist)
- decidir o prompt cinematográfico ou vocabulário de câmera de um vídeo gerado — skill 27 e
references/vocabulario-cinematografico.md dela
- analisar/transcrever conteúdo de um vídeo existente (o que está sendo dito, resumo) — skill 54 (video-analysis)
- animação de interface web (CSS/JS, Framer Motion, GSAP) — skill 12 (motion-design)
- decidir qual trecho de um vídeo longo é o "melhor highlight" sem critério objetivo declarado pelo usuário — pedir o critério antes de cortar, não adivinhar
- composição de thumbnail ou grading "para ficar bonito" sem direção estética já definida — isso é decisão de gosto, volta pro humano ou pra skill 02/29
Entradas Esperadas
- arquivo(s) de vídeo/áudio local(is), com caminho absoluto ou relativo ao projeto
- operação desejada em linguagem natural ("corta os primeiros 10s", "normaliza pra -14 LUFS")
- critério objetivo quando a operação envolve seleção de trecho (timestamp, ou regra mecânica como "todo silêncio > 2s")
- preset de plataforma de destino, quando aplicável (Reels, TikTok, YouTube Shorts, podcast, broadcast)
Saidas Esperadas
- arquivo de mídia processado, no formato/container/loudness pedido
--json com o resultado da operação: comando ffmpeg executado, streams afetados, métricas medidas (duração, LUFS, resolução)
--dry-run disponível em toda operação que escreve arquivo: mostra o plano sem executar
- relatório de verificação (
verify) quando a entrega precisa confirmar integridade antes de considerar pronta
Protocolo
1. Identificar a operação e o script correspondente
Tabela de intenção → script → flags principais. Adaptar o comando à necessidade real, não copiar cegamente.
| Intenção do usuário |
Script |
Flags principais |
| "quanto dura esse vídeo / que formato é" |
probe.py |
(nenhuma — só leitura) |
| "corta de X a Y" / "extrai esse trecho" |
cut.py |
--start, --end, --segments |
| "junta esses clipes" |
join.py |
lista de arquivos, ordem |
| "detecta onde tem silêncio" / "remove silêncio" |
silence.py |
limiar de dB, duração mínima |
| "detecta corte de cena" |
scenes.py |
limiar de diferença de frame |
| "muda pra formato 9:16 / 1:1 / 16:9" |
fit.py |
--aspect, --fit pad|crop|blur |
| "queima legenda desse .srt" |
caption.py |
--srt, --text, --animate |
| "põe esse logo/texto por cima" |
overlay.py / graphics.py |
posição, opacidade, timing |
| "aplica essa LUT / corrige HDR pra SDR" |
color.py / look.py |
--lut, perfil de cor |
| "borra esse rosto / essa placa" |
redact.py |
região (coordenadas ou tracking) |
| "normaliza o áudio pra -14 LUFS" |
loudness.py |
-I <LUFS>, --tp <true peak> |
| "sincroniza esse áudio com o vídeo" |
sync.py |
offset ou detecção automática |
| "sincroniza essas câmeras" |
multicam.py |
--switch energy|manual |
| "exporta pro formato do Reels/TikTok/podcast" |
export.py / render.py |
--template, --preset |
| "verifica se esse arquivo tá íntegro" |
verify.py / check.py |
(nenhuma — só leitura) |
| "gera uma versão leve pra revisar rápido" |
proxy.py |
resolução alvo |
| "extrai só o áudio" |
audio.py |
formato de saída |
| "acelera/desacelera o vídeo" |
speedramp.py |
fator de velocidade, curva |
| "congela um frame" |
freeze.py |
timestamp, duração |
| "endireita o horizonte" |
straighten.py |
ângulo ou detecção automática |
| "estabiliza a câmera tremida" |
stabilize.py |
(parâmetros de suavização) |
| "roda em lote pra vários arquivos" |
batch.py |
script alvo + lista de arquivos |
Para 3+ operações encadeadas, preferir um arquivo de projeto consumido por render.py a encadear scripts manualmente — reduz reencode intermediário e erro de ordem.
Catálogo completo dos 42 scripts (incluindo os não cobertos pela tabela acima — denoise.py, stabilize.py, deinterlace.py, grid.py, broll.py, entre outros) em references/catalogo-scripts.md.
2. Respeitar a ordem de encadeamento prescrita
Quando a operação envolve múltiplos passos, a ordem importa e não é arbitrária:
color/look (HDR→SDR, LUT) → cut → join → silence → fit → caption/overlay → sync → audio → loudness → export
Razão prática: mudanças de frame (color, cut, fit) precisam acontecer antes de legenda/overlay, porque texto posicionado antes de um crop/pad fica com tamanho ou posição errados depois. Sincronização de áudio acontece depois de qualquer corte que altere a duração do vídeo. Loudness é o penúltimo passo, export roda por último.
3. Lossless-first — nunca reencodar sem necessidade
Antes de qualquer operação que reescreve o arquivo, checar se o resultado pode ser obtido sem reencode:
- corte em keyframe exato → stream-copy (
cut.py faz isso por padrão; usar --accurate só quando o corte precisa ser frame-exato e cair fora de um keyframe)
- mudança que afeta só o container (remux) ou só o áudio → não tocar no stream de vídeo
loudness.py faz stream-copy do vídeo por padrão, normalizando só o áudio
Reencodar sem necessidade é o erro mais caro desta skill — cada reencode desnecessário degrada qualidade e multiplica tempo de processamento. Quando o reencode for inevitável (ex.: mudança de resolução, aplicação de LUT), usar CRF 18 em passos intermediários; o export.py final aplica o preset de entrega.
4. Medir antes de confiar — --json, não a linha de resumo
Toda ferramenta de escrita aceita --dry-run (mostra o plano sem executar) e --json/--json-brief (saída estruturada com comando ffmpeg executado, streams afetados, métricas). Confiar no --json, nunca num número resumido em texto solto — se a operação precisa reportar duração, LUFS medido, ou resolução final, ler o campo estruturado, não parafrasear de memória.
python scripts/loudness.py video.mp4 -I -14 --tp -1 --json
# → {"status": "ok", "measured_lufs_before": -22.3, "measured_lufs_after": -14.0, "command": "ffmpeg -i ..."}
5. Verificar antes de entregar
Depois de qualquer cadeia de operações, rodar verify.py/check.py no arquivo final antes de considerar a tarefa concluída — confirma que o container não está corrompido, que os streams de áudio e vídeo existem e têm duração compatível, e que o arquivo abre. Isso é o gate de policies/verification-before-completion.md aplicado a mídia: "rodei o comando" não é "confirmei que o resultado está correto".
Presets de Plataforma (loudness e formato de entrega)
| Plataforma |
Loudness alvo |
Aspect ratio comum |
Nota |
| Instagram/TikTok Reels |
-14 LUFS |
9:16 |
true peak -1 dBTP |
| YouTube (geral) |
-14 LUFS |
16:9 |
aceita HDR |
| Podcast (voz) |
-16 LUFS |
— (áudio) |
mono ou stereo conforme distro |
| Broadcast (referência EBU R128) |
-23 LUFS |
16:9 |
usar quando o destino for TV/streaming formal |
Confirmar o alvo do preset com o usuário quando a plataforma de destino não foi dita — não assumir Reels como padrão universal.
Heuristicas
- Um script por operação declarada, não uma cadeia de comandos ffmpeg ad-hoc na hora. Os scripts já encapsulam a sintaxe correta de filtro/flag para cada operação — escrever um comando
ffmpeg cru repete trabalho que o script já resolve e tem mais chance de erro de sintaxe.
probe.py/verify.py antes de qualquer edição em arquivo desconhecido — confirmar codec, resolução, framerate e integridade antes de assumir que a operação vai funcionar como esperado.
- Batch (
batch.py) só depois de validar em 1 arquivo — rodar a operação em lote sem confirmar o resultado no primeiro arquivo multiplica o erro por N arquivos.
Anti-Padroes
- decidir sozinho que um trecho é "o melhor highlight" sem critério objetivo do usuário — pedir o critério (duração, palavra-chave, pico de áudio) antes de cortar
- aplicar grading ou LUT e declarar que "ficou mais cinematográfico" — é medição (curva de cor aplicada), não avaliação de gosto
- reencodar um arquivo inteiro quando um corte em keyframe ou um remux resolveria sem perda
- reportar duração/LUFS/resolução de memória ou por estimativa quando
--json está disponível para medir de verdade
- rodar
batch.py em N arquivos sem ter confirmado o resultado em 1 primeiro
- ignorar a ordem de encadeamento (ex.: aplicar caption antes de fit) e produzir legenda mal posicionada depois do crop
- prometer "arquivo verificado" sem ter rodado
verify.py/check.py de fato
Evidencia de Conclusao
- arquivo de saída existe no caminho esperado, com o formato/container pedido
--json da operação confirma as métricas relevantes (duração, LUFS, resolução) batendo com o pedido
verify.py/check.py rodado no arquivo final sem erro
- se a operação envolveu decisão de plataforma, o preset usado foi confirmado com o usuário (não assumido)
Handoff
Recebe de
- Skill 27 (video-integration-specialist) — quando o vídeo gerado por IA precisa de pós-produção (corte, legenda, normalização) antes de entrega
- Skill 54 (video-analysis) — quando a análise identificou um trecho a extrair ou um problema técnico a corrigir
- Skill 69 (character-pipeline-2d) — quando o pipeline de animação 2D produz clipes que precisam de junção/exportação final
Entrega para
- Skill 54 (video-analysis) — se o arquivo processado precisa de transcrição/análise de conteúdo depois de editado
- Humano/skill 02 ou 29 — qualquer decisão de gosto (grading estético, composição de thumbnail) que a mensagem do pedido não resolveu objetivamente
Seguir policies/handoffs.md.
Integracao com Pipeline
- Orchestrator (09): roteia para cá quando o pedido é edição de mídia já existente, distinto de geração (skill 27) ou análise (skill 54)
- Skill 27 (video-integration-specialist): ponteiro de saída — a linha "Quando Não Usar" da 27 (edição pós-produção) aponta para esta skill
Fontes
Skill adaptada de kajisho5/ffmpeg-skill (MIT) — os 42 scripts Python (stdlib + subprocess sobre ffmpeg/ffprobe), a tabela de intenção→script→flags, a ordem de encadeamento prescrita, a estratégia lossless-first, e a fronteira mecânico-vs-subjetivo foram traduzidos e adaptados ao formato deste kit. O mecanismo real de schema para agentes de planejamento no upstream é o comando contract --json (fonte de verdade junto com doctor --json) — não usar outro nome para ele.
1---2name: ffmpeg-media3description: Skill de edição e manipulação mecânica de vídeo/áudio via ffmpeg — corte, junção, legenda, normalização de loudness, detecção de silêncio, redação, correção de aspect ratio, mudança de velocidade, extração de metadados. Roda 100% local via scripts Python (stdlib + subprocess), sem API paga e sem upload de arquivo. Preenche o gap que a skill 27 (video-integration-specialist) declara fora de escopo: geração de vídeo por IA não é edição de vídeo existente. Trigger em: "segundos desse video", "cortar esse video", "juntar clipes", "clipes num video so", "queimar essa legenda", "legenda .srt no video", "normaliza esse audio", "-14 LUFS", "loudness", "remove os trechos de silencio", "detecta silencio", "muda esse video de 16:9 pra 9:16", "aspect ratio sem esticar", "borra o rosto", "borrar rosto no video", "sincroniza esse audio", "audio separado com o video", "extrai os metadados desse", "metadados desse arquivo de video", "exporta esse video no formato", "formato certo pro TikTok", "ffmpeg", "editar video local se4---56# FFmpeg Media — Edição Mecânica de Vídeo e Áudio78Esta skill executa uma edição, não decide uma. Corta, junta, mede, sincroniza, exporta e verifica arquivos de mídia — decisões estéticas (o que é "interessante" num highlight, se uma grade parece "cinematográfica", composição de thumbnail) ficam fora de escopo e voltam pro humano ou pra skill de criação correspondente.910## Governanca Global1112Esta skill segue `GLOBAL.md`, `policies/execution.md`, `policies/tool-safety.md`, `policies/verification-before-completion.md`, `policies/self-correcting-sensors.md` e `policies/anti-rationalization.md`.1314**Fronteira mecânico vs. subjetivo — o princípio central desta skill:** aplicar uma LUT nomeada, cortar em coordenadas exatas, medir loudness em LUFS são operações mecânicas, dentro de escopo. Decidir "essa cor combina com a marca", "esse trecho é o melhor momento do vídeo" ou "isso parece profissional" são julgamentos que pedem contexto humano — a skill relata a medição (waveform, LUFS, duração de cena) e devolve a decisão para quem pediu, nunca decide sozinha e apresenta como fato.1516## Quando Usar1718- cortar, juntar, ou re-sequenciar clipes de vídeo já existentes19- queimar legenda (`.srt`) ou overlay de texto/gráfico num vídeo20- normalizar loudness de áudio para o padrão de uma plataforma (Reels, podcast, broadcast)21- detectar e remover silêncio, ou detectar cortes de cena automaticamente22- mudar aspect ratio para o formato de uma plataforma (crop, pad, blur de fundo)23- redigir (borrar/pixelizar) uma região do vídeo — rosto, placa, documento24- sincronizar múltiplas câmeras ou trilha de áudio separada25- extrair metadados, gerar proxy de baixa resolução, ou verificar integridade do arquivo final26- exportar para o preset de uma plataforma específica (loudness, resolução, container corretos)2728## Quando Nao Usar2930- gerar vídeo novo a partir de texto/imagem via IA (text-to-video, image-to-video) — isso é skill 27 (video-integration-specialist)31- decidir o *prompt* cinematográfico ou vocabulário de câmera de um vídeo gerado — skill 27 e `references/vocabulario-cinematografico.md` dela32- analisar/transcrever conteúdo de um vídeo existente (o que está sendo dito, resumo) — skill 54 (video-analysis)33- animação de interface web (CSS/JS, Framer Motion, GSAP) — skill 12 (motion-design)34- decidir qual trecho de um vídeo longo é o "melhor highlight" sem critério objetivo declarado pelo usuário — pedir o critério antes de cortar, não adivinhar35- composição de thumbnail ou grading "para ficar bonito" sem direção estética já definida — isso é decisão de gosto, volta pro humano ou pra skill 02/293637## Entradas Esperadas3839- arquivo(s) de vídeo/áudio local(is), com caminho absoluto ou relativo ao projeto40- operação desejada em linguagem natural ("corta os primeiros 10s", "normaliza pra -14 LUFS")41- critério objetivo quando a operação envolve seleção de trecho (timestamp, ou regra mecânica como "todo silêncio > 2s")42- preset de plataforma de destino, quando aplicável (Reels, TikTok, YouTube Shorts, podcast, broadcast)4344## Saidas Esperadas4546- arquivo de mídia processado, no formato/container/loudness pedido47- `--json` com o resultado da operação: comando ffmpeg executado, streams afetados, métricas medidas (duração, LUFS, resolução)48- `--dry-run` disponível em toda operação que escreve arquivo: mostra o plano sem executar49- relatório de verificação (`verify`) quando a entrega precisa confirmar integridade antes de considerar pronta5051## Protocolo5253### 1. Identificar a operação e o script correspondente5455Tabela de intenção → script → flags principais. Adaptar o comando à necessidade real, não copiar cegamente.5657| Intenção do usuário | Script | Flags principais |58|---|---|---|59| "quanto dura esse vídeo / que formato é" | `probe.py` | (nenhuma — só leitura) |60| "corta de X a Y" / "extrai esse trecho" | `cut.py` | `--start`, `--end`, `--segments` |61| "junta esses clipes" | `join.py` | lista de arquivos, ordem |62| "detecta onde tem silêncio" / "remove silêncio" | `silence.py` | limiar de dB, duração mínima |63| "detecta corte de cena" | `scenes.py` | limiar de diferença de frame |64| "muda pra formato 9:16 / 1:1 / 16:9" | `fit.py` | `--aspect`, `--fit pad\|crop\|blur` |65| "queima legenda desse .srt" | `caption.py` | `--srt`, `--text`, `--animate` |66| "põe esse logo/texto por cima" | `overlay.py` / `graphics.py` | posição, opacidade, timing |67| "aplica essa LUT / corrige HDR pra SDR" | `color.py` / `look.py` | `--lut`, perfil de cor |68| "borra esse rosto / essa placa" | `redact.py` | região (coordenadas ou tracking) |69| "normaliza o áudio pra -14 LUFS" | `loudness.py` | `-I <LUFS>`, `--tp <true peak>` |70| "sincroniza esse áudio com o vídeo" | `sync.py` | offset ou detecção automática |71| "sincroniza essas câmeras" | `multicam.py` | `--switch energy\|manual` |72| "exporta pro formato do Reels/TikTok/podcast" | `export.py` / `render.py` | `--template`, `--preset` |73| "verifica se esse arquivo tá íntegro" | `verify.py` / `check.py` | (nenhuma — só leitura) |74| "gera uma versão leve pra revisar rápido" | `proxy.py` | resolução alvo |75| "extrai só o áudio" | `audio.py` | formato de saída |76| "acelera/desacelera o vídeo" | `speedramp.py` | fator de velocidade, curva |77| "congela um frame" | `freeze.py` | timestamp, duração |78| "endireita o horizonte" | `straighten.py` | ângulo ou detecção automática |79| "estabiliza a câmera tremida" | `stabilize.py` | (parâmetros de suavização) |80| "roda em lote pra vários arquivos" | `batch.py` | script alvo + lista de arquivos |8182Para 3+ operações encadeadas, preferir um arquivo de projeto consumido por `render.py` a encadear scripts manualmente — reduz reencode intermediário e erro de ordem.8384Catálogo completo dos 42 scripts (incluindo os não cobertos pela tabela acima — `denoise.py`, `stabilize.py`, `deinterlace.py`, `grid.py`, `broll.py`, entre outros) em `references/catalogo-scripts.md`.8586### 2. Respeitar a ordem de encadeamento prescrita8788Quando a operação envolve múltiplos passos, a ordem importa e não é arbitrária:8990```91color/look (HDR→SDR, LUT) → cut → join → silence → fit → caption/overlay → sync → audio → loudness → export92```9394Razão prática: mudanças de frame (color, cut, fit) precisam acontecer **antes** de legenda/overlay, porque texto posicionado antes de um crop/pad fica com tamanho ou posição errados depois. Sincronização de áudio acontece depois de qualquer corte que altere a duração do vídeo. Loudness é o penúltimo passo, `export` roda por último.9596### 3. Lossless-first — nunca reencodar sem necessidade9798Antes de qualquer operação que reescreve o arquivo, checar se o resultado pode ser obtido sem reencode:99100- corte em keyframe exato → stream-copy (`cut.py` faz isso por padrão; usar `--accurate` só quando o corte precisa ser frame-exato e cair fora de um keyframe)101- mudança que afeta só o container (remux) ou só o áudio → não tocar no stream de vídeo102- `loudness.py` faz stream-copy do vídeo por padrão, normalizando só o áudio103104Reencodar sem necessidade é o erro mais caro desta skill — cada reencode desnecessário degrada qualidade e multiplica tempo de processamento. Quando o reencode for inevitável (ex.: mudança de resolução, aplicação de LUT), usar CRF 18 em passos intermediários; o `export.py` final aplica o preset de entrega.105106### 4. Medir antes de confiar — `--json`, não a linha de resumo107108Toda ferramenta de escrita aceita `--dry-run` (mostra o plano sem executar) e `--json`/`--json-brief` (saída estruturada com comando ffmpeg executado, streams afetados, métricas). **Confiar no `--json`, nunca num número resumido em texto solto** — se a operação precisa reportar duração, LUFS medido, ou resolução final, ler o campo estruturado, não parafrasear de memória.109110```bash111python scripts/loudness.py video.mp4 -I -14 --tp -1 --json112# → {"status": "ok", "measured_lufs_before": -22.3, "measured_lufs_after": -14.0, "command": "ffmpeg -i ..."}113```114115### 5. Verificar antes de entregar116117Depois de qualquer cadeia de operações, rodar `verify.py`/`check.py` no arquivo final antes de considerar a tarefa concluída — confirma que o container não está corrompido, que os streams de áudio e vídeo existem e têm duração compatível, e que o arquivo abre. Isso é o gate de `policies/verification-before-completion.md` aplicado a mídia: "rodei o comando" não é "confirmei que o resultado está correto".118119## Presets de Plataforma (loudness e formato de entrega)120121| Plataforma | Loudness alvo | Aspect ratio comum | Nota |122|---|---|---|---|123| Instagram/TikTok Reels | -14 LUFS | 9:16 | true peak -1 dBTP |124| YouTube (geral) | -14 LUFS | 16:9 | aceita HDR |125| Podcast (voz) | -16 LUFS | — (áudio) | mono ou stereo conforme distro |126| Broadcast (referência EBU R128) | -23 LUFS | 16:9 | usar quando o destino for TV/streaming formal |127128Confirmar o alvo do preset com o usuário quando a plataforma de destino não foi dita — não assumir Reels como padrão universal.129130## Heuristicas131132- **Um script por operação declarada, não uma cadeia de comandos ffmpeg ad-hoc na hora.** Os scripts já encapsulam a sintaxe correta de filtro/flag para cada operação — escrever um comando `ffmpeg` cru repete trabalho que o script já resolve e tem mais chance de erro de sintaxe.133- **`probe.py`/`verify.py` antes de qualquer edição em arquivo desconhecido** — confirmar codec, resolução, framerate e integridade antes de assumir que a operação vai funcionar como esperado.134- **Batch (`batch.py`) só depois de validar em 1 arquivo** — rodar a operação em lote sem confirmar o resultado no primeiro arquivo multiplica o erro por N arquivos.135136## Anti-Padroes137138- decidir sozinho que um trecho é "o melhor highlight" sem critério objetivo do usuário — pedir o critério (duração, palavra-chave, pico de áudio) antes de cortar139- aplicar grading ou LUT e declarar que "ficou mais cinematográfico" — é medição (curva de cor aplicada), não avaliação de gosto140- reencodar um arquivo inteiro quando um corte em keyframe ou um remux resolveria sem perda141- reportar duração/LUFS/resolução de memória ou por estimativa quando `--json` está disponível para medir de verdade142- rodar `batch.py` em N arquivos sem ter confirmado o resultado em 1 primeiro143- ignorar a ordem de encadeamento (ex.: aplicar caption antes de fit) e produzir legenda mal posicionada depois do crop144- prometer "arquivo verificado" sem ter rodado `verify.py`/`check.py` de fato145146## Evidencia de Conclusao147148- arquivo de saída existe no caminho esperado, com o formato/container pedido149- `--json` da operação confirma as métricas relevantes (duração, LUFS, resolução) batendo com o pedido150- `verify.py`/`check.py` rodado no arquivo final sem erro151- se a operação envolveu decisão de plataforma, o preset usado foi confirmado com o usuário (não assumido)152153## Handoff154155### Recebe de156157- Skill 27 (video-integration-specialist) — quando o vídeo gerado por IA precisa de pós-produção (corte, legenda, normalização) antes de entrega158- Skill 54 (video-analysis) — quando a análise identificou um trecho a extrair ou um problema técnico a corrigir159- Skill 69 (character-pipeline-2d) — quando o pipeline de animação 2D produz clipes que precisam de junção/exportação final160161### Entrega para162163- Skill 54 (video-analysis) — se o arquivo processado precisa de transcrição/análise de conteúdo depois de editado164- Humano/skill 02 ou 29 — qualquer decisão de gosto (grading estético, composição de thumbnail) que a mensagem do pedido não resolveu objetivamente165166Seguir `policies/handoffs.md`.167168## Integracao com Pipeline169170- **Orchestrator (09):** roteia para cá quando o pedido é edição de mídia já existente, distinto de geração (skill 27) ou análise (skill 54)171- **Skill 27 (video-integration-specialist):** ponteiro de saída — a linha "Quando Não Usar" da 27 (edição pós-produção) aponta para esta skill172173## Fontes174175Skill adaptada de [kajisho5/ffmpeg-skill](https://github.com/kajisho5/ffmpeg-skill) (MIT) — os 42 scripts Python (stdlib + subprocess sobre ffmpeg/ffprobe), a tabela de intenção→script→flags, a ordem de encadeamento prescrita, a estratégia lossless-first, e a fronteira mecânico-vs-subjetivo foram traduzidos e adaptados ao formato deste kit. O mecanismo real de schema para agentes de planejamento no upstream é o comando `contract --json` (fonte de verdade junto com `doctor --json`) — não usar outro nome para ele.