之前 shuohao-skills 在 GitHub 爆火,它做的事大家都眼熟了:把一本小说喂进去,跑一遍 skill,出来角色设定、分镜投产包,直接对接下游视频生成管线。但片子出来之后呢?你花了一下午跑通正向管线,拿到一条 3 分钟的 AI 短片,想检查质量就绕不开拉片。可拉片这件事到了 AI 视频时代反而更麻烦了——手动数镜头边界、估时长、写表格、截关键帧,一条 200 秒的短片认真拉一遍至少半小时。
Wesley Wang(也就是 shuohao-skills 的作者)最近发布了 reelbench-skills,这是同一条管线的反向——把成片拆回镜头。而且他选了一个极其聪明的切入口:不做 SaaS,不做 Web 应用,直接做成 Claude Code / Codex 的 skill。零 npm 依赖、零 API key、git clone 加一条软链命令就能用。
核心设计:代码量 vs 模型判
README 开头第一句话就刻在骨子里:镜头边界是量出来的,不是看出来的。模型看视频最不可靠的就是报时间。于是整条拉片流水线分成两部分,互不越界:
代码查:切点(ffmpeg 场景检测)→ 时长(切点相减,两位小数)→ 实测运动(逐帧差分中位数)
模型判:景别 → 类别 → 运镜 → 画面描述 → 节奏
为什么要这么分?因为视频生成模型最常见的幻觉就是在运动和时间上。声称推/拉/摇/移,实际画面纹丝不动;声称镜头 2 秒,实际切得更早。ffmpeg 场景检测是像素级的,切点和时长是物理量,帧间差分运动曲线也是可验证的数据——代码不说谎。
运镜必须和像素对得上
15 道质量门里,最有意思的是"运镜实测对账":声称大幅运镜却实测帧间变化接近 0,直接拦。这道门的逻辑是:摄影机真动了,像素不可能不变。模型如果写"推镜头",但 ffmpeg 跑出来的帧间差分中位数接近零——那就是幻觉,拦下来重写。
反过来,如果模型写"固定机位"但实测帧间变化偏高——它不拦,只给提示:"固定机位,实测运动偏高,若是主体在动就对,若是机位在动要改运镜"。为什么不拦?因为固定机位前面有人跳舞,帧间差一样会爆。误拦的门比没有门更糟,所以这道门只守它守得住的那一向。
15 道质量门
其他质量门也都写得很实,没有模糊不清的规则:
- 时间轴连续:按时间排序、首尾相接、从 0.00 开始、收在片尾(容差可配)
- 画面描述可核对:中文 ≥12 字 / 英文 ≥8 词,空话词表("氛围感" / "visually stunning")直接拦,不许"这个镜头…"开头
- 画面描述不重复:两镜一字不差 = 没看第二遍
- 运镜实测对账:声称大幅运镜却实测帧间变化接近 0 → 直接拦
- 时长合理:单镜头 ≥0.3 秒,总时长与片长匹配
video-sync 合成
另一个上线的 skill 是 video-sync,把 video-shots 产出的拉片数据和原片合成一条"画面对照片"——一边是视频,一边是当前镜头的分镜信息,镜头切了信息跟着切。方便逐镜核对拉片结果。
写在最后
reelbench-skills 的哲学很清晰:把能测量的交给代码,把需要理解的交给模型,把最容易出错的测量和验证牢牢攥在代码手里。AI 视频的下半场,拼的不是谁能生成,而是谁能评估、谁能复现、谁能从一次生成里学到东西。