1实现原理 · 为什么它能做到
把构件解剖成「两行文本 + 图形底床」三个元素(name / role / bar),并硬性限制为两行。
Keep it to two lines. A name line + role line is the whole job — extra lines erode the hierarchy and crowd the safe area.
防廉价的第一条:标题绝不允许硬切进出。
1. **Never hard-cut a title on or off.** A bare appear/disappear reads as a mistake. Even a 12-frame fade or slide makes it feel produced.
第二条:错峰出场——bar → name → role,每个元素错开 3–6 帧。
**Stagger, don't slam.** Animate the bar first, then the name, then the role, each offset by 3–6 frames.
用帧预算(而非感觉)规定三段时序:入场 12–18f、停留 90–150f、出场 8–12f,且出场更快。
| Exit | 8–12f (0.27–0.4s) | Faster than enter |
安全区按画幅分别给定;竖屏 9:16 的要求是把条带整体抬高,而不是贴着底部。
| 9:16 (1080×1920) | Same left margin; **lift the band up** | Bottom ~18% (captions/UI), top ~12% |
层级靠字号对比兜底:name 至少是 role 的 1.6 倍,拿不准就把 name 加大而不是把 role 缩小。
**Size contrast** ≥ 1.6× (name vs role).
可模板化是这套代码的根本理由:name/role/theme 必须是 props,roster 逐行 --props 渲染成多条独立片。
In a renderer, make the roster an input prop and render once per row (`--props`) to emit one branded clip per person
验证针对「三相位 + 批次」设计:先验一行再批渲染,且出场帧必须看到部分揭示(证明动画真的在跑)。
**Batch roster**: verify ONE row via stills *before* rendering all names — catch a layout/overflow bug once, not N times.
2核心能力
3外部依赖
| 类型 | 依赖 |
|---|---|
| cli | npx remotion still / render / compositions |
| cli | scripts/contact-sheet.sh + scripts/probe-mp4.sh(仓库根共享验证工具箱,SKILL.md 明列) |
| cli | jq + ffmpeg/prores 编码(reference 的 roster 批量脚本与透明输出) |
| package | ffmpeg / ffprobe(系统依赖) |
4风险提醒 风险提醒:蓝色 · 知晓即可
- 批量段的数据→文件名未净化 — reference 的 jq 循环用 name 派生 slug 作输出文件名,未剥离路径分隔符;恶意的/异常的 roster 数据(例如从 CSV/LLM 生成)可让写入落在 out/ 之外。批量前应自行校验 name,或改用索引命名。
- 验收全靠人读静帧,无自动断言 — 「层级是否成立、品牌是否正确、是否溢出」都由 agent 读 PNG 判断;skill 与脚本都没有对字体缺失、文字溢出、对比度不足的自动检查(probe-mp4 只验成片规格)。批量 N 条时这一步是唯一防线。
- 字体与 logo 资产由用户提供,许可与缺失无人兜底 — BRAND 里 font/logo/audio 均为用户自备(reference 示例仅写 "Inter, system-ui, sans-serif");商用字体授权与资产缺失(静帧里表现为 fallback 字体)都需用户自负,skill 不校验。
- 跨画幅复用易踩坑,仅靠表格与媒体查询提示 — 同一设计要从 16:9 挪到 9:16 需改基线(0.80→0.70)与安全区;SKILL.md 给了表,但没有可切换的多画幅注册示例,agent 需自行处理,容易忘记抬高条带。
- 只装单个 skill 目录会让 scripts/ 引用悬空 — SKILL.md 以相对路径调用仓库根 scripts/contact-sheet.sh 与 probe-mp4.sh;只拷贝 skills/lower-thirds 的安装方式会得到不存在的路径,验证回路失效。
5第二遍独立确认
- [ok] SKILL.md 的三条「防廉价规则」是否真在 reference 组件里被实现(防第一遍只读散文) — reference §1 明写 "Enter staggers the bar, name, then role; exit is computed from the end of the clip so the title leaves faster than it arrived.",组件导入 `Sequence, interpolate, spring, useCurrentFrame, useVideoConfig`,Theme 类型与 BRAND 对象齐备(font/bar/name/role/radius/marginPct)。规则 → 代码可逐条对应,非空头承诺。
- [discrepancy] reference 批量脚本的文件名派生是否会越出输出目录(第一遍遗漏的面) — 原文:`slug=$(echo "$row" | jq -r '.name' | tr '[:upper:] ' '[:lower:]-')` 紧接 `npx remotion render LowerThird "out/${slug}.mp4" --props="$row"`。tr 只做大小写与空格到连字符的映射,不剥离 `/`、`..`、前导 `-` 等字符;若 roster 的 name 含路径分隔符,输出路径可越出 out/。这是数据→文件名的注入面,仅影响本地写入位置,不构成权限提升;SKILL.md 正文未把它写成安全事项。属对 pin commit 有效的真实出入(脚本可改进,非虚假声明)。
- [ok] 「9:16 抬高档位」是否在代码里有对应实现(不只是表格建议) — reference 的 Quick reference 表给出「9:16 placement | `baseline 0.80→0.70` / the media query」,说明竖屏不是靠新组件,而是同一组件换基线/媒体查询;与 SKILL.md「lift the band up」一致。
- [unlocatable] 「3–5s 停留」「≥1.6× 字号对比」这类经验值是否有出处 — SKILL.md 写 "Roughly 3–5s on screen (read it aloud twice)." 与 "**Size contrast** ≥ 1.6×",仓库内无测量脚本、无引用来源、无 A/B 数据;属经验判据,不作为已核事实,仅记为文档建议。
- [ok] 跨包共享脚本与「Packaged helper」引用是否真实存在(防悬空引用) — SKILL.md 只点名 scripts/contact-sheet.sh 与 scripts/probe-mp4.sh;两者在仓库根真实存在且可执行(-rwxr-xr-x),三仓库逐字节相同(contact-sheet.sh md5 b7dcc28034c9bf8fda5d48683e54d8b5、probe-mp4.sh 167b7977c50f492014e1a6fef8c9ed12)。seek-shot.sh 未被本 skill 点名,不构成悬空引用。
- [ok] 透明叠加输出建议是否是真实可用的编码路径 — reference 给的是 Remotion CLI 自身的参数(`--codec=prores --prores-profile=4444` 或 `--image-format=png`),属该工具既有能力,非虚构 flag;能否落地取决于用户环境的 prores 支持,但命令形式正确。
6结论
5b146268b6b14b5c…2a775336b5