Communitygithub.com

eternityspring/reelbench-skills

Combine shot breakdown data from a video with the original footage to produce a **directly viewable video**: one side shows the video, the other side shows the shot info (shot number, start/end, duration, shot scale, type, camera movement, description, dialogue). **Shot cuts update the info** and the shot list auto-scrolls and highlights the current shot. The layout adapts to the original video's aspect ratio: **landscape/square → video on top, info below; portrait → video on the left, info on the right**. The video is scaled as-is, no cropping or stretching. The shot list **scrolls as the video plays**: at cut points, it scrolls a small distance to bring the current shot to the anchor and then stops, with the highlight smoothly sliding along. Implementation uses only three images (base + two long spread images), scrolling and highlighting is done by ffmpeg cropping windows over time. **Layout is entirely in scripts/panel.css** – modify it to change the layout without touching the scripts. Consumes shots.json produced by video-shots (uses frames/ as thumbnails when available). Zero npm dependencies; uses ffmpeg for compositing and a headless browser to render the panel. Use when asked to export a video, composite a video, produce an annotated shot video, a commentary video, a video with shot info, or an annotated shot video (any language).

Qu'est-ce que reelbench-skills ?

Ce skill, `eternityspring/reelbench-skills`, synthétise les données de découpage technique (`shots.json`) avec une vidéo source pour produire une vidéo lisible directement. Côté vidéo, l’utilisateur voit l’image originale ; de l’autre côté, il voit **les informations détaillées du plan en cours** (numéro, durée, échelle, type, mouvement, description, dialogues). **Les informations se mettent à jour automatiquement à chaque changement de plan**, et la liste des plans défile et surligne le plan actuel. Le layout **s’adapte automatiquement** au ratio de la vidéo source : paysage ou carré → image en haut, infos en bas ; portrait → image à gauche, infos à droite. L’image reste intacte, sans recadrage ni étirement. Le défilement de la liste se fait via un mécanisme simple : **trois images seulement** sont générées (une base, et deux grandes étendues de la liste, une sombre et une claire), et le défilement/surlignage est réalisé par `ffmpeg` qui découpe une fenêtre temporelle, ce qui évite de devoir découper une image par plan. Le CSS de la vue d’information se trouve dans `scripts/panel.css` — le modifier suffit à changer la mise en page, sans toucher au script principal. Le skill ne nécessite aucun paquet npm, utilisant uniquement ffmpeg et un navigateur sans tête pour le rendu. Il est conçu pour être utilisé lorsqu’on demande : exporter une vidéo avec informations de plan, vidéo de découpage, vidéo commentée, ou toute demande similaire en anglais ou en français.

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

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

video-sync

Combine shots.json + la vidéo source pour produire une vidéo : d’un côté l’image, de l’autre les informations du plan en cours, qui se mettent à jour à chaque changement de plan. La liste des plans défile automatiquement et le plan actuel est surligné.

Le layout ne dépend que du ratio de la vidéo source :

Vidéo sourceLayoutMéthode de composition
Paysage (largeur > hauteur), carréImage en haut, informations en basvstack
Portrait (hauteur > largeur)Image à gauche, informations à droitehstack

Dans les deux cas, l’image est redimensionnée sans recadrage ni étirement ; le panneau occupe l’espace restant.

Seulement trois images sont générées ; le mouvement est confié à ffmpeg. Les seules choses qui changent dans le panneau sont : l’endroit où on défile et quelle ligne est surlignée. Donc on calcule une fois les positions des lignes, on découpe une image de fond, et on découpe deux longues images étendues de la liste des plans (une assombrie, une entièrement claire). Le défilement = on découpe une fenêtre dans l’image longue sombre, le surlignage = on découpe une ligne dans l’image longue claire et on la superpose. Les positions sont pilotées par une petite expression envoyée par sendcmd à chaque point de coupe. Pour une vidéo de 53 plans, le nombre de captures d’écran passe de 53 à 3 (12 secondes).

Le plan actif est toujours en deuxième ligne : les plans 1 et 2 ne défilent pas (le surlignage descend d’une ligne), à partir du plan 3, à chaque coupe, on remonte d’une ligne. Le mouvement n’a lieu qu’aux points de coupe — le défilement se fait avec --ease (0,45 s par défaut) puis s’arrête. Pour un plan de 16 secondes, la liste reste immobile pendant toute sa durée, évitant de fatiguer les yeux.

La hauteur des lignes est déterminée par le contenu : une description longue donne une ligne haute ; la barre de surlignage utilise des hauteurs de ligne (la crop ne peut pas être modifiée en cours d’exécution).

{baseDir} = le répertoire contenant ce fichier. Le script {baseDir}/scripts/video-sync.mjs ne nécessite aucune dépendance, s’exécute directement avec node.

Limites (ce que le skill ne fait pas) : ne fait pas l’analyse de découpage (c’est le rôle de video-shots, ce skill consomme son shots.json), ne coupe pas, ne fait pas de transitions, n’ajoute pas de musique, n’incruste pas de sous-titres dans l’image, ne fait pas de rendu image par image (les effets dynamiques sont réalisés par ffmpeg en découpant des fenêtres temporelles).


Étape 0 — Avoir d’abord les données de découpage

Il faut un fichier shots.json (produit par video-shots) et la vidéo source correspondante. Avoir un dossier frames/ (une image clé par plan) est un plus — la liste des plans utilisera la première image comme vignette, sinon une case vide sera affichée.

Le shots.json doit correspondre à la vidéo : si meta.durationSeconds ne correspond pas à la durée de la vidéo, ne pas composer — retour d’abord corriger le découpage.

Étape 1 — Vérifier la géométrie avant de traiter la vidéo

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

Calcule uniquement (sans composer) et donne le résultat en quelques secondes : layout, zone vidéo, zone panneau, dimensions de sortie. Vérifiez d’abord que ces trois nombres sont corrects avant de continuer — composer une vidéo de 3 minutes prend 1 à 2 minutes, ce serait dommage de recommencer après une erreur.

Si le résultat ne vous convient pas, ajustez : --panel <ratio> (pour un paysage, c’est la hauteur du panneau divisée par la hauteur de la vidéo, défaut 0,8 ; pour un portrait, c’est la largeur du panneau divisée par la largeur de la vidéo, défaut 1,6), --width / --height (limite supérieure de la zone vidéo, défaut 1920 / 1080).

Si la vidéo source est trop petite, agrandissez la zone vidéo : Le panneau est calculé par rapport à la zone vidéo. Pour une vidéo 640×360, le panneau ne ferait que 640×288, les quatre colonnes seraient illisibles. --scale 2 agrandit la zone vidéo à 1280×720 et le panneau à 1280×576, en conservant les proportions. La valeur par défaut est 1 (réduction seulement, pas d’agrandissement). plan / panels / compose / export doivent toutes utiliser le même --scale.

Étape 2 — Rendre le panneau

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

Produit static.png (fond), list-dim.png / list-lit.png (les deux longues images étendues de la liste, une assombrie, une claire), layout.json (les positions de chaque ligne, utilisées lors de la composition pour calculer le défilement), et un fichier panels/panel.html — ouvrez-le dans un navigateur pour prévisualiser le panneau. Changez #S07 pour voir l’effet d’un autre plan (l’animation de défilement dans l’aperçu correspond à celle de l’export).

Pour modifier la mise en page, modifiez {baseDir}/scripts/panel.css et relancez panels — la nouvelle mise en page sera prise en compte sans toucher au script ni repenser la logique de capture d’écran. Les conventions de style sont décrites dans {baseDir}/references/panel-style.md.

Étape 3 — Composer

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

La piste audio est copiée telle quelle depuis la vidéo source (si la vidéo est muette, aucune piste audio n’est ajoutée). Une fois la composition terminée, stderr affiche les dimensions, la durée et le layout de la sortie. Vérifiez visuellement.

Les deux étapes peuvent être combinées :

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

Étape 4 — Vérification par captures d’écran ⛔ Ne pas sauter

Ne vous fiez pas seulement à l’absence d’erreur de composition. Prélevez au moins trois images pour vérifier que les informations correspondent bien à l’image :

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

Vérifiez trois choses : à quel plan appartient cette image, le numéro de plan sur le panneau correspond-il, la ligne surlignée suit-elle le plan ? Si ce n’est pas le cas, le shots.json ne correspond pas à la vidéo, ou le paramètre --video est erroné.

Rapportez en une phrase : chemin de sortie, dimensions, durée, layout, nombre de plans, et éventuellement quelles images du panneau n’ont pas été rendues.


Limites

  • Le défilement n’a lieu qu’aux points de coupe : le défilement dure --ease secondes puis s’arrête. Le panneau est fixe entre les coupes. Si vous voulez un défilement continu et lent, vous pouvez modifier le motionPlan segmenté, mais pour les plans longs, cela fatiguera les yeux.
  • Nécessite un navigateur sans tête (Chrome / Chromium / Edge). C’est le prix à payer pour pouvoir modifier librement la mise en page : si on utilisait drawtext de ffmpeg pour le panneau, il faudrait gérer les retours à la ligne en chinois, les vignettes et le surlignage soi-même, et modifier une mise en page nécessiterait de retoucher les filtres.
  • Le vocabulaire (échelle de plan / type / mouvement / transition) est intégré dans ce skill, pas importé depuis un autre module — le skill doit pouvoir être copié dans son intégralité. Si video-shots ajoute un nouveau terme, il faudra l’ajouter ici aussi, sinon il sera affiché comme une clé d’énumération.
  • Le rendu du panneau utilise toujours trois captures d’écran, indépendamment du nombre de plans : 53 plans ≈ 12 secondes. La composition dépend de la durée de la vidéo : 203 secondes ≈ 75 secondes.

Auto-test

node {baseDir}/scripts/selftest.mjs

122 assertions, sans utiliser ffmpeg ni navigateur : géométrie (paysage/carré/portrait, dimensions paires, limites, réglages), contrat de données de la page du panneau (vocabulaire fourni, rôles rythmiques, vignettes présentes ou absentes, échappement), commandes d’animation (chacune doit être courte — une expression trop longue fait échouer la configuration de ffmpeg), paramètres ffmpeg. Lancez ce test après avoir modifié le script.

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。

Skills associés