短片视频 (HyperFrames)
经“The Brief”展示片验证。人们评价短片的标准是节奏和叙事,而不仅仅是精美的画面——仅仅把漂亮的场景拼接在一起,会被认为是“普通”。给它一个带有起伏的故事。
1. 故事优先(在任何代码之前)
编写一个 5–8 拍的故事情节,每一拍展示一个能力,而剪辑本身就能讲述故事。已经验证的模式: 钩子(一个问题 + 一个倒计时)→ 工作展示(每节展示一个技能)→ 转折/障碍(冻结帧,客户反馈)→ 爆发式回应 → 胜利狂欢 → 交付 → 结束卡片。 一个持续显示的 HUD(跳切显示的时钟、阶段标签)能让观众在快速剪切的画面中保持方向感。
然后在一个网格上制作线索表:150 BPM = 节拍 0.4 秒,小节 1.6 秒(或者 120 BPM = 0.5 秒)。每次剪切、撞击和字幕都对齐节拍;段落变化在小节线上切换。钩子部分 = 前 1.6-3.2 秒内每拍一个字。
2. 从模板开始
cp -R templates/chop-reel videos/<name> && cd videos/<name>
../../.venv/bin/python score.py # 生成 assets/audio/score.wav
python3 build.py 169 # 生成 index.html (16:9); build.py 916 生成 9:16
npx --yes [email protected] lint && npx --yes [email protected] render -o ../../out/<name>-169.mp4
reel.js 结构——请按此顺序编辑:
- 场景 (Scenes):
function scene(g, l)在本地时间l绘制整个帧。使用相对单位(W、H、M、PORT)以便两种宽高比都能工作;fit()可将文本缩小到最大宽度。 - 镜头 (SHOTS):
[t0, t1, scene]— 剪辑本身。null表示被过渡覆盖。 - 特效列表 (FX lists):
PUNCH(每次剪切及额外节拍上,缩放 1.06 倍并在 0.2 秒内衰减)、FLASH(在掉帧处显示 2 帧全白,在段落切分处显示半白)、SHAKES[开始时间, 持续时间, 幅度]、WHIPS(场景间带运动模糊的推进效果,平均 9 个子帧渲染)。 - 视频片段(画布艺术、字幕工具渲染、AI 镜头)作为
<video class="clip">放在 顶部,在build.py中使用 GSAP 实现其自身的缩放动画;画布在下方绘制黑色背景。
3. 动态效果库
对于命名的动态效果,使用 motion-prompt 技能:node ~/.claude/skills/motion-prompt/scripts/motion-prompt.mjs get 001 043 返回每个效果的发布规范(曲线、持续时间、过冲)。将 数值 精确地翻译到 reel.js 中,并在注释中引用它们(// #043 甩镜头: …)——用户能注意到效果是“受到启发”还是直接使用。
有用动态效果:
#001 弹出、
#005 蒙版揭示、
#007 数字滚动、
#008 动态文字、
#010 过冲、
#017 蒙版、
#020 缩放穿越、
#023 毛刺效果、
#024 冲击抖动、
#038 速度变速、
#040 冻结帧、
#043 甩镜头、
#046 爆发式剪切。
4. 声音
使用 score 技能:复制 examples/phonk_150bpm_45s.py 生成完整的陷阱/Funk 配乐,或者扩展模板中的 score.py。reel.js 中的每次撞击/闪光都在同一时间点触发音效(冲击、掌声、掉帧前的上升音、冻结时的唱片刮擦声、爆发式剪切前的静默)。通过 Kokoro 实现人声旁白,声音压低;通过 caption-video 实现字幕。
5. 检查并交付
- 在两种宽高比下快照每个段落,检查:9:16 中无裁剪,文字不少于短边的 4%。
- 渲染两种版本,使用 loudnorm −14 LUFS 标准化音量,两者均交付。文件名命名为
out/<Title> (16x9).mp4/(9x16).mp4。 - 修订:修改 SHOTS / 场景函数 → 重建两种宽高比 → 渲染。