1实现原理 · 为什么它能做到
把「作品集级 showreel」拆成可复现的构建:一条母题贯穿 6–7 个被 HUD 命名的工种章节,收尾回到母题,而不是逐镜堆效果。
A showreel promises that every frame was a decision. … Hard cuts are reserved for the flurry.
HUD 是常驻层:裁切标记、标题行、规格行(分辨率/帧率/实测 BPM)、时间码、章节标尺与章节名,并随背景明暗翻转墨/纸。
**Persistent HUD.** Corner crop marks … It flips ink/paper with the background.
剪辑锁在 120–130 BPM 网格:硬切、闪白、反相都落在网格线 ±2 帧内,并在中点前留一个「预降拍」空档。
**Cut on the beat, animate on the off-beats.** … comes before the midpoint hit.
结构按拍分配:约 75% 发展 / 13% flurry / 12% 收尾,先加速后保持;密度也要呼吸(一个物体 → 字墙 → 100 格 → 数千粒子 → flurry → 一个词)。
**Accelerate, then hold.** … and 12% resolve.
风格来源不是形容词,而是一份逐秒量化拆解:BPM、拍点锚、每次硬切落点、亮度节奏、音频电平。
- **Tempo:** 128 BPM … Grid anchor about 0.51s. … - **Hard cuts land on beats:** 1.77 (flash) … within 2 frames of a grid line.
音乐先量相位再剪:用 kick 频段(120Hz 低通)相位对齐,而不是全频段相位,否则每次拼接会晚半拍。
`music-grid` prints the period, the **kick-band phase** (use it) … the script warns when the two disagree.
动画由逐帧纯函数驱动(时间 → 全部状态),canvas 效果从种子值绘制,保证 seek 确定性。
Put a **per-frame driver** on the timeline … never from `Math.random()` at draw time.
验证是拿同一把尺量自己:切点距拍点 ≤35ms、亮度按章节交替、音频有预降拍,并抽连续 10 帧条带看每个转场;品牌测试要求遮住 HUD 仍认得出。
- Run `analyze-reference.mjs` on your own render with `--bpm` and `--phase`: cut … luminance must alternate by chapter … Brand test: pick 6 random frames. … read as the brand with the HUD covered.
2核心能力
3外部依赖
| 类型 | 依赖 |
|---|---|
| cli | FFmpeg / ffprobe(接触表、亮度/RMS 分析、音乐拼接、premix) |
| api | Kie.ai 任务 API(Suno 音乐 / Seedream 图 / Kling 视频;付费、消耗本人额度) |
| api | Kie.ai 文件上传(把本地参考图以 base64 上传换 downloadUrl) |
| api | ElevenLabs 音效生成(付费) |
| cli | HyperFrames CLI(lint / Studio 预览 / draft render / 最终 render) |
| package | 兄弟 skill 依赖:hyperframes、gsap,与仓库根 MOTION_PHILOSOPHY.md / video-storytelling |
| network | 字体:要求下载到项目 assets/fonts/ 用 @font-face(远端拉取发生在取材期,不在渲染期) |
4风险提醒 风险提醒:橙色 · 评估后使用
- 凭证与额度:付费生成消耗本人 Kie.ai 额度,并把密钥放进请求头、把本地图片 base64 外传 — kie.mjs 读 KIE_API_KEY 后带 Bearer 调 api.kie.ai;image/video 子命令先把本地参考图上传到 kieai.redpandaai.co。使用前应确认额度与素材可外传(含未发布品牌素材),并留意 key 出现在请求与日志链路。
- 向上 8 层探测 .env 的读取行为超出项目根 — loadKey() 从脚本目录逐级向上最多 8 层查找任意 .env 并解析 key 名;多项目/多租户机器上可能读到与本任务无关的 .env。建议改用显式环境变量而非依赖探测。
- 「先确认再付费」只是提示层约束,无技术开关 — 脚本没有交互式确认或 --dry-run;自动化流水线里无人把关时可能直接产生多笔付费调用(音乐/SFX/图/视频)。见 second_pass 的 discrepancy 条。
- 参考片数字不可复现(文档声明 ≠ 可核事实) — 见 second_pass 的 unlocatable 条;照抄其数值设计自己的片子前应先用自己的素材重测。
- 品牌/字体/音乐合规由使用者负责 — SKILL.md 只要求「只使用用户有权的品牌标记」并让字体下载到本地,未提供授权校验;商用发布前需自行确认商标、字体与音乐许可。
- 平台前提较硬:Node 22+ 与带 ffprobe 的 FFmpeg — SKILL.md 明写 'They need Node 22+ and FFmpeg with ffprobe.';不满足时全部脚本不可用。
5第二遍独立确认
- [ok] KIE_API_KEY 是否真的被读取并外发(橙档关键证据) — kie.mjs:19 `if (process.env.KIE_API_KEY) return process.env.KIE_API_KEY;`,随即 loadKey() 向上 8 层找 .env 并抓 KIE_API_KEY,无 key 抛 'KIE_API_KEY is not set. Add it to .env (see docs/TOOLS-AND-API-KEYS.md).';带 Authorization: Bearer 调 createTask/recordInfo/credit。调用点真实存在。
- [ok] ELEVENLABS_API_KEY 读取与外发是否属实 — sfx.mjs:15 `if (process.env.ELEVENLABS_API_KEY) return process.env.ELEVENLABS_API_KEY;`(无 key 抛错);文件头注释声明 PAID 并要求先确认。
- [ok] 是否存在文档未提及的隐藏网络调用或脚本 — 全目录 URL/网络 token 扫描只命中上述网络点与 docs.kie.ai 文档链接;beatgrid.mjs 纯计算,其余 mjs 仅 ffmpeg 子进程。未发现混淆代码、动态 eval 或静默外发。
- [unlocatable] 参考片量化数字能否在源码内复现 — references/reference-breakdown.md 的 128 BPM、各切点时间、亮度序列与 RMS 值,是作者对一条私有样片(Opus 5.5 的 CLAUDE / MOTION REEL)跑 analyze-reference.mjs 的结果;pin 仓库内既无该样片也无原始报告输出,本次只读侦查不运行分析,故这些数值仅作「文档声明」记录,不当已核事实使用(分析器能力本身已可读验证)。
- [discrepancy] 「付费调用先确认」是技术门禁还是提示层约束 — [判定:提示层,非技术强制]脚本头注释显式声明 PAID,SKILL.md 在音乐与 SFX 两处也写 paid call / confirm before running;但脚本没有任何交互式确认开关或 --dry-run,门禁靠 agent 遵守。已在 risks 中如实标注。
- [ok] HUD 模板与 SKILL.md 的 HUD 规格是否一致(文档/资产是否脱节) — templates/hud.html 头注释要求把 <style> 粘进合成、#hud 作为 #root 最后子节点、由 hudFrame(t)(t 的纯函数)驱动,并提供 --hud-acc / .hud-tl / .hud-tr / #ptime / CH / SEGB / paperRanges 的品牌替换清单,与 SKILL.md 第 4 条规格一一对应。
6结论
cc870e83245405bd…0d30152a82