Communitygithub.com

eternityspring/reelbench-skills

Combina dados de decupagem com o vídeo original para gerar um vídeo **diretamente assistível**: de um lado a imagem, do outro as informações do plano (número, início/fim, duração, enquadramento, categoria, movimento, descrição da cena, falas). A informação muda conforme o plano muda, a tabela rola automaticamente e destaca o plano atual.

O que é reelbench-skills?

Esta skill do agente de IA (projetada para plataformas como Claude Code, Cursor, Codex, etc.) gera um vídeo lado a lado combinando o arquivo `shots.json` (resultado de decupagem da skill `video-shots`) com o vídeo original. Ela cria uma visualização informativa: o vídeo original é exibido de um lado, enquanto a tabela de decupagem rola automaticamente do outro, destacando o plano atual e sincronizando as informações (número do plano, duração, enquadramento, etc.) com o ponto de corte. A skill usa o `ffmpeg` para composição, um navegador headless para renderizar o painel (permitindo que a aparência seja totalmente personalizada via CSS) e emprega uma estratégia de três capturas de tela para otimizar o desempenho, reduzindo drasticamente o número de capturas necessárias. Não possui dependências npm e é invocada por meio de comandos específicos, como `export`, `plan`, `panels` e `compose`. É útil para criadores de conteúdo, editores de vídeo e desenvolvedores que precisam gerar rapidamente vídeos de revisão de decupagem.

Funciona com✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/eternityspring/reelbench-skills/tree/HEAD/skills/video-sync

Perguntar na sua IA favorita

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

Documentação

video-sync

Combine shots.json + vídeo original em um único vídeo: de um lado a imagem, do outro as informações do plano atual, que mudam quando o plano muda, com a tabela rolando e destacando automaticamente.

O layout depende apenas da proporção do vídeo original:

OriginalLayoutComposição
Paisagem (largura > altura), QuadradoImagem em cima, informações em baixovstack
Retrato (altura > largura)Imagem à esquerda, informações à direitahstack

Ambas as direções garantem que a imagem seja redimensionada sem cortes ou distorções, o painel preenche o espaço restante.

Apenas três capturas de tela são feitas; o movimento é deixado para o ffmpeg. Apenas duas coisas mudam no painel: a rolagem e a linha destacada. Então, medimos a posição das linhas uma vez, capturamos a base e duas imagens longas com a tabela de planos (uma escura, uma totalmente clara). A rolagem = recortar uma janela da imagem longa escura; o destaque = sobrepor uma linha recortada da imagem longa clara. A posição é controlada por pequenas expressões sendcmd em cada ponto de corte. Para um vídeo de 53 planos, as capturas de tela caem de 53 para 3 (12 segundos).

O plano atual é fixado na segunda linha: os planos 1 e 2 não rolam (o destaque desce uma linha); a partir do plano 3, a cada corte, sobe uma linha. Movimento apenas no corte, estático dentro do plano – no corte, a rolagem leva --ease (padrão 0,45) segundos para parar na posição. Em um plano longo de 16 segundos, a lista subiria continuamente, forçando o espectador a acompanhá-la por 16 segundos.

A altura da linha é determinada pelo conteúdo: descrições longas resultam em linhas mais altas; a barra de destaque é estratificada por altura (crop não pode ser alterado em tempo de execução).

{baseDir} = o diretório deste arquivo. O script {baseDir}/scripts/video-sync.mjs não tem dependências, execute diretamente com node.

Limites (o que não faz): Não faz decupagem (é trabalho do video-shots; esta skill consome seu shots.json), não edita, não faz transições, não adiciona música, não queima legendas na imagem, não faz renderização quadro a quadro (animações são feitas pelo ffmpeg cortando janelas por tempo).


Passo 0 — Tenha os dados de decupagem primeiro

Você precisa de um shots.json (saída do video-shots) e do vídeo original correspondente. Ter frames/ (um quadro-chave por plano) é melhor – a tabela de planos usará o quadro inicial como miniatura; caso contrário, ficará em branco.

O shots.json deve corresponder a este vídeo: se meta.durationSeconds não corresponder ao vídeo original, não combine – corrija a decupagem primeiro.

Passo 1 — Veja a geometria primeiro, depois o vídeo

node {baseDir}/scripts/video-sync.mjs plan shots.json --video <video>

Apenas calcula, não compõe – resultado em segundos: layout, área de vídeo, área do painel, dimensões de saída. Confirme esses três números antes de continuar – compor um vídeo de 3 minutos leva 1-2 minutos; recalcular se estiver errado não vale a pena.

Ajuste se necessário: --panel <proporção> (para paisagem: altura do painel / altura do vídeo, padrão 0,8; para retrato: largura do painel / largura do vídeo, padrão 1,6), --width / --height (limite superior da área de vídeo, padrão 1920 / 1080).

Se o vídeo original for muito pequeno, aumente a área de vídeo: o painel é calculado a partir da área de vídeo. Para um vídeo 640×360, o painel teria apenas 640×288, com quatro colunas amontoadas e ilegíveis. --scale 2 aumenta a área de vídeo para 1280×720 e o painel para 1280×576, mantendo a proporção. O padrão é 1 (apenas reduz, não amplia). plan / panels / compose / export todos precisam do mesmo --scale.

Passo 2 — Renderize o painel

node {baseDir}/scripts/video-sync.mjs panels shots.json --video <video> \
  --frames frames --lang zh|en [--out panels] [--chrome <caminho>]

Gera static.png (base), list-dim.png / list-lit.png (imagens longas com a tabela de planos completa, uma escura e uma clara), layout.json (posição de cada linha, usada na composição para calcular a rolagem), além de panels/panel.html – abra-a no navegador para visualizar o painel. Altere #S07 para ver o efeito em diferentes planos (a animação de rolagem na prévia corresponde à exportação).

Para alterar o layout, edite {baseDir}/scripts/panel.css e execute panels novamente para obter o novo layout – sem precisar modificar o script ou repensar a lógica de captura de tela. Convenções de estilo em {baseDir}/references/panel-style.md.

Passo 3 — Componha

node {baseDir}/scripts/video-sync.mjs compose shots.json --video <video> \
  [--panels panels] [-o out.mp4] [--crf 20] [--ease 0.45]

A faixa de áudio é copiada do original (vídeos sem áudio automaticamente não recebem áudio). O stderr exibirá as dimensões de saída, duração e layout – verifique-os.

As duas etapas podem ser feitas em um único comando:

node {baseDir}/scripts/video-sync.mjs export shots.json --video <video> -o out.mp4 --frames frames

Passo 4 — Extraia quadros para verificação ⛔ Não pule

Não entregue apenas porque a composição não deu erro. Extraia pelo menos três quadros para verificar se as informações correspondem à imagem:

for t in 5 30 60; do ffmpeg -v error -y -ss $t -i out.mp4 -frames:v 1 -q:v 3 /tmp/check-$t.jpg; done

Verifique três coisas: se o quadro atual pertence ao plano correto, se o número do plano no painel é o mesmo e se a linha de destaque o acompanha. Se não corresponder, geralmente é porque o shots.json não é do mesmo vídeo ou --video aponta para o arquivo errado.

Relate em uma frase: caminho de saída, dimensões, duração, layout, número de planos e quais imagens do painel não foram renderizadas (se houver).


Limites

  • A rolagem só acontece nos cortes: rola por --ease segundos e para; o painel fica estático dentro do plano. Se quiser que suba continuamente, é possível (altere os segmentos do motionPlan), mas em planos longos cansará os olhos
  • Requer um navegador headless (Chrome / Chromium / Edge). Esse é o preço de poder alterar o layout facilmente: usar drawtext do ffmpeg para o painel exigiria implementar manualmente quebra de linha em chinês, miniaturas e destaque
  • O vocabulário (enquadramento / categoria / movimento / transição) está embutido nesta skill – não importa de outro diretório para que a skill seja portátil. Se video-shots adicionar novos termos, eles devem ser adicionados aqui também, caso contrário aparecerão como chaves de enumeração
  • A renderização do painel sempre tira três capturas de tela, independentemente do número de planos: 53 planos ≈ 12 segundos. A composição depende da duração do vídeo: um vídeo de 203 segundos leva cerca de 75 segundos

Autoteste

node {baseDir}/scripts/selftest.mjs

122 asserções, sem usar ffmpeg ou navegador: geometria (paisagem/quadrado/retrato, arestas pares, limites, botões), contrato de dados da página do painel (envio de vocabulário, papéis rítmicos, miniaturas presentes ou não, escape), comandos de animação (cada um deve ser curto – expressões longas fazem o ffmpeg falhar na configuração), parâmetros do ffmpeg. Execute este teste após modificar os scripts.

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

eternityspring/reelbench-skills

把一条视频重建成「只有画面和声音」的干净文件——**源片的元数据一概不搬**: GPS、设备型号、账号 ID、创建时间、章节、GoPro 的遥测轨,全部留在原地。 走的是白名单而不是黑名单:不列要删什么,只说带什么过去(画面一条流、声音一条流), 隐私保证来自结构,不来自枚举。 难点不在容器 tag,在**看不见的那几层**:x264 把完整编码参数写成 SEI 塞在码流里、 AAC 把版本号写进 DSE、avc1 的 compressorname 里还有一份——`ffprobe` 一个都看不见。 五个藏身处逐一堵死,每一处都有实测。 默认 `--mode copy`:**画面逐字节照搬**(cmp 验证过),只重编音频,53 秒的片子 1.3 秒跑完; `--mode encode` 完整重编码,多杀掉码流域的东西。 验收不靠声称:把源片所有元数据字符串当「针」,在输出文件里做**字节级扫描**, 扎到一根就红。12 道门全部由脚本确定性检查。 零依赖、零 API key,只要 node 和 ffmpeg。 Use when asked to 清元数据、去元数据、抹掉视频信息、视频隐私、去水印信息、 strip video metadata、remove exif from video、scrub video。

eternityspring/reelbench-skills

拉片:把一条成片拆成逐镜头的分析表——每个镜头的时长、景别、类别、运镜、画面。 分工刻在骨子里:**能量的都由代码量**(切点来自 ffmpeg 场景检测,时长是切点相减, 运动量是逐帧差分的中位数),模型只判断它真正该判断的那几件事(景别 / 类别 / 运镜 / 画面 / 节奏), 然后每一条判断都被代码当场对账——**声称推拉摇移却实测几乎不动,门直接拦**。 看片走联系表(每镜起手帧 + 收尾帧各拼一张大图,一屏二十几个镜头,a/b 对照就是运镜), 不是一张张翻。检测漏刀多刀用 recut 补刀并刀,自动重编号重算时长,手改边界过不了门。 产出 shots.json + Markdown 镜头表 + **单页交互式拉片报告**:内嵌播放器(播放时同步高亮镜头、 点镜头跳转)、镜头节奏带、可搜索可筛选可排序的镜头表(列表 / 卡片两种视图、首尾关键帧并排、 点图开大图)、景别类别运镜分布、出场人物、质量门、导出 JSON。单文件零依赖,离线双击能开。 15 道质量门全部由脚本确定性检查。 零依赖、零 API key,只要 node 和 ffmpeg。 Use when asked to 拉片、拆镜头、分析视频镜头、镜头时长、景别、运镜、镜头表、 video shot breakdown、shot list from video。

Habilidades Relacionadas