Communitygithub.com

ErtanLabs Motion - 确定性动效管线

通过确定性的 HTML 到视频管线,直接制作、渲染并验证动效。每一项动效作品都从真实的“源世界”人造物中借鉴其视觉语法,使用决策账本记录每一个选择,在按帧编号的节拍表中规划时间,通过捆绑的并行渲染器输出帧精确的 MP4、ProRes(含 Alpha)或 WebM,并由内置的检查工具测量保持帧、响度、闪烁、颜色标签和平台安全区。

ErtanLabs Motion - 确定性动效管线 是什么?

ErtanLabs Motion 是一个面向开发者与 AI 智能体的专业动效制作技能,旨在将动效制作的每一个开放选择都明确化、可追溯且可验证。它通过一套严格的“三阶段”工作流(决定-制作-证明)来运作:首先,从与主题相关的真实人造物中提取视觉语法,以替代默认的通用选择,并将所有决策记录在 `ledger.md` 中;然后,按帧规划节拍和运动,根据元素的质量等级选择曲线和时长,并渲染 HTML 为视频文件;最后,使用 `check.py` 工具对输出文件进行质量测量,包括保持帧占比、响度、闪烁等。该技能支持 Sprint(快速制作)、Studio(品牌工作)、Series(系列内容)、Revision(修订)和 Narrated explainer(旁白解说)等多种工作模式,并支持 HTML+render.mjs 原生管线,以及集成到 Remotion 或 HyperFrames 项目中。它特别适用于运动排版、解说视频、数据动画、品牌影片、标题序列、社交竖版视频等场景,并因其对每个决策的严格溯源机制,有效避免产出“通用、乏味”的动效。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/ErtanLabs/ertanlabs-motion/tree/HEAD/skills/ertanlabs-motion

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

ErtanLabs Motion

动效工作往往会以一种可预见的方式变得平庸:任何在简要说明中未明确的选择,都会被最常见的选项填充,而由这些最常见选项拼凑出的视频,与成千上万其他视频毫无区别。本技能使这些开放选择变得明确,为每个选择提供可追溯的来源,进行确定性渲染,并在任何人看到文件之前对其进行质量测量。

核心规则:每个可见的选择都有其所有者。 如果你无法指出一个字体、颜色、曲线或声音的来源,那就等于没人选择过它。

工作流程

阶段步骤产出物
A · 决定A1 探测机器--doctor 结果,所选后端
A2 解析需求核心摘要、画布、素材清单、配乐、护栏、标记的假设
A3 寻找源世界作品借鉴其语法的人造物、叙事装置、核心节拍
A4 写出默认方案,然后推翻它最常见的版本及其替代方案
A5 维护账本与合成文件同级的 ledger.md
B · 制作B1 按帧规划包含计划保持帧的节拍表
B2 权衡每个元素质量等级、引导与跟随
B3 让世界设定字体、颜色和声音从源世界填充的账本行
B4 预览,然后渲染检查过的核心帧,然后是视频文件
C · 证明C1 测量与观看check.py 报告、联系表、提示索引
C2 标记声明并移交按证据分组的移交文件

工作模式

  • Sprint (短篇单一创意作品,或“只管做”):自行选择源世界,编写一个五行账本 (核心摘要、源世界、核心节拍、三个被替换的默认值、画布),然后构建。预览和测量仍然需要执行。
  • Studio (品牌工作,较长作品,不清晰的需求):使用 --stills 为两个候选源世界渲染核心帧,并将两幅图像并排展示;人们判断图片比描述更快。用户进行选择;如果无人决定,保留其核心帧能在缩略图模糊测试 (C1) 中胜出的那个,并在账本中注明原因。
  • Series (同一频道或活动的多集内容):首先阅读项目中之前所有的 ledger.md 文件。新的一集不得同时重复前一集的源世界和核心节拍结构;品牌常量带有 fixed 标签,可以豁免。
  • Revision (对已交付作品的意见):将每条意见映射到节拍表的行,并将修改编写为期拍表差异,旧行 → 新行。例如:“开头太慢” → grid 6-30 → 4-16, hold 30-60 → 16-40,后续每一行都偏移 -20 帧。仅渲染更改的范围 (--range) 以供审阅,然后渲染完整作品,并将差异追加到账本。
  • Narrated explainer (视频论文、纪录片、历史、金融、犯罪或科学类由旁白驱动的故事,纸拼贴风格):旁白是时钟,每一句话都成为一个节拍。两条规则承载了大部分质量:保持帧与其句子一同结束,屏幕上的每个事实要么被说出,要么在便条上注明来源。阅读 references/paper-collage-explainer.md 并从 assets/collage-template.html 开始。

制作级别

独立于工作模式,每件作品都有一个级别,写在账本中:

  • Graphic (默认):在平面画布上应用源世界的语法。适用于覆盖层、下方三分之一、UI 元素、数据快照以及任何编辑器合成的作品。
  • Film:将人工制品置于其场景中,通过摄影机观察,由源世界解释的光源照明,具有材质、节拍之间的生动变化、三到四个场景,以及带音乐的精心设计声音。适用于展示片、登录页和仓库首页、品牌影片、发布活动、地图和路线展示,以及每当有人要求“电影感”、“生动”、“高级”或“不那么平面”时。在规划前阅读 references/film-level.md;它会在节拍表之上添加一个场景列表及其自身的检查项。

阶段 A · 决定

A1 探测机器

node scripts/render.mjs --doctor

输出结果决定了后端:Node、Playwright 或已安装的 Chrome/Edge、ffmpeg、ffprobe、NVENC。用一行报告给用户。如果 HTML 路径不可用,B4 会列出替代方案;如果用户已经有 Remotion 或 HyperFrames 项目,则在其内部工作。

A2 解析需求

  1. 核心摘要: 视频所说的唯一一句话。没有它,作品会沦为装饰;起草一条并确认。
  2. 画布: 比例、时长、fps、目标平台。尺寸和安全区:references/formats-and-safe-zones.md。
  3. 素材清单: 视频素材、屏幕录制、标志、照片、数据、AI 生成的画面。现有材料应塑造概念,而不是堆叠其上。
  4. 配乐: 旁白、音乐或无。有旁白或音乐时,音频设定时间 ( references/sound-and-sync.md )。用户提供的音频是最终的:未经用户同意,绝不添加或移除停顿、剪切、拉伸或重新计时;而是调整画面以匹配。
  5. 护栏: 品牌字体和颜色、必要和禁止的元素、截止日期。

未知项在账本中成为假设,标记为 assumed。只有当答案会改变源世界时,才提出问题。

A3 寻找源世界

不要选择“一种风格”。选择一个来自主题世界的真实人造物并借鉴其语法:一张潮汐表、一份药房说明书、一个翻页式出发告示牌、一卷地震仪记录纸、一份涂黑的机密档案、一个编辑的剪报桌。一个人造物能同时解决多个决策——它所用的字体、提供调色板的墨水和材质、事物在其上的变化方式(翻转、印刷、填充、绘制、盖章)、其表面——从而让所有决策相互一致。

  1. 列出五个与该主题相关的人会实际接触或阅读的人造物。
  2. 优先选择本身带有运动的人造物:那些能够自行翻转、印刷、填充、绘制、盖章或滚动的东西。
  3. 借鉴规则,而非图片。 不是在文字后面放一张车票的照片,而是采用车票的逻辑:穿孔线表示分离,序列号用于计数,印章表示作废。

references/source-worlds.md 描述了按运动方式分组的 31 个源世界。将其视为校准工具;最适合某项工作的源世界往往不在列表中。

再命名两件事:

  • 叙事装置: 一句话说明核心摘要如何变得可见(“潮汐曲线绘制出来,画面中的水随着笔尖移动”)。
  • 核心节拍: 承载核心摘要的那个节拍。它获得最长的计划保持帧,以及作品中最大的状态或尺度变化。渲染后,check.py 测量的最长保持帧应该是核心节拍;如果不是,则说明重点放错了位置。在有旁白的情况下,保持帧仍然与其句子和之后的停顿一同结束。如果核心节拍需要更多时间,在旁白仍在撰写或录制时要求更长的停顿;对于已完成的旁白,让保持帧适应,绝不让画面在下一句台词出现时保持不动。

A4 写出默认方案,然后推翻它

第一个想法通常是最常见的那个。让它可见,然后替换它:

  1. 用一句诚实的话写出这个视频的默认版本:一个普通模型会根据这个提示生成什么。
  2. 选择该行中至少三个决策(字体、调色板、布局、入场、过渡、声音),并为每个决策写出一个替代方案及其来源:源世界、材质、数据或配乐。
  3. 一个你无法给出理由替代的默认值可以保留;它会进入账本,标记为 owned default。

A5 维护账本

在构建之前填写它,展示它,并将其保存为与合成文件同级的 ledger.md。它也是下一集的记忆。

LEDGER · <项目> · <日期>
核心摘要:
画布: 1080×1920 · 30 fps · 8 s · Reels · 安全区: 竖屏
源世界:
叙事装置:
核心节拍 (帧数):
默认版本 (一句话):

| 图层       | 决策                      | 来源/原因                         | 它替代的默认值 |
|-------------|---------------------------|---------------------------------|-----------------|
| 字体       |                           |                                 |                 |
| 调色板     | 十六进制值 + 每色的用途   | 采样自 ...                      |                 |
| 布局       |                           |                                 |                 |
| 时间基准   | fps, 质量等级, 保持帧     |                                 |                 |
| 纹理       |                           |                                 |                 |
| 声音       |                           |                                 |                 |
| 过渡       |                           |                                 |                 |

权利 (字体, 音乐, 数据, 图像):
假设:

阶段 B · 制作

B1 按帧规划

节拍表是一种紧凑的曝光表:在编写代码之前,以数据形式编写的运动。范围是 [in, out) 帧数;保持帧有它们自己的行。

BEAT SHEET · 30 fps · 240 frames (8 s) · 1080×1920
| 节拍 | 帧数     | 元素         | 类别     | 动作                            | 承载关系 | 声音          |
|------|----------|--------------|----------|---------------------------------|----------|---------------|
| 1    | 6-30     | 网格         | 标记     | 线条绘制, 交错出现               | 入场     | 笔触声        |
| 1    | 30-60    | -            |           | 保持帧                          |          |               |
| 2    | 60-168   | 潮汐曲线     | 布景     | 绘制; 水随着笔尖移动              | 链接     | 低涌声        |
| 2    | 168-198  | -            |           | 保持帧 (核心节拍)               |          | 静默          |
| 3    | 198-200  | 标题         | 印章     | 落于水面                        | 着陆     | 一声敲击      |
保持帧占比: 30-60, 168-198, 200-240  →  计划保持帧占比 42%

承载关系 命名了观众获得的东西:一个元素入场,两件事链接,一个状态变化,或者一个节拍着陆在配乐上。空的承载关系单元格表示装饰;将其删除。

保持帧占比 是没有任何有意义移动的帧的份额。解说片和标题工作通常处于 20-35%,音乐剪辑蒙太奇更低,沉思性作品更高。颗粒和缓慢的亚 2 像素漂移是纹理,而非运动。check.py 测量这个比率,以便比较计划和结果。

有旁白或音乐时,将单词和时间戳转换为帧数,并写入表中。在有旁白的情况下,每个节拍还得到一个提示词,即其第一个重读的单词:节拍的主要元素在提示词出现时就位,并且没有保持帧会延续到下一个句子。

B2 权衡每个元素

为每个元素赋予一个质量等级;该等级从其曲线和时长来自 references/motion-and-timing.md 中的集合,因此时长因质量不同而不同,而非凭个人口味。

类别典型元素入场离场曲线
道具圆点, 标签, 小数字6-12 f4-8 fsettle 入场, launch 离场
面板标题, 卡片, 图表区块14-24 f10-16 fheavy
布景摄影机, 水面, 地图, 大范围区域30-90 f20-45 fheavy; 机械运动用 linear
标记线条, 路径, 下划线, 手写长度 ÷ ~30 像素/帧淡出pen
印章作废标记, 最终值, 剪切1-2 f-step
  • 引导和跟随。 在任何时刻,都有一个移动在引导;其他任何移动都是由它引起的(笔触到达极端位置,所以它的标签打开)。
  • 依赖顺序。 一个元素只有在其所依赖的元素出现在屏幕上之后才会出现:坐标轴在其数据之前,路径在其标记之前。
  • 海报帧。 第 0 帧通常是缩略图,因此将其构图为一个完整的、可读的图像,并让运动从中生长出来。
  • 帧精确。 每个值仅根据帧数计算得出:没有真实时钟 CSS、定时器或未播种的随机数 (references/composition-contract.md)。

B3 让世界设定字体、颜色和声音

  • 字体 继承自源世界。强调必须在缩略图模糊测试 (C1) 中存活:仅靠色调标记的词在缩小并变为灰度时不可见,因此使用大小、字重、位置或时间来强调。设置 <html lang> 并使用符合语言环境的字母大小写;render.mjs 会对页面上实际存在的文字进行字形测试。详细信息:references/typography.md。
  • 颜色: 每种颜色都有一个命名的工作(底色、文字色、信号色、数据系列色)。没有工作的颜色将被移除。采样值而不是凭空创造:python scripts/check.py --palette reference.jpg。详细信息:references/color-and-texture.md。
  • 声音 声明只能是“已测量”或“未验证”,因为音频无法通过肉眼检查。声音列中的每个条目都指向一个可见的起因或背景音。详细信息:references/sound-and-sync.md。

B4 预览,然后渲染

后端适用时机
HTML + render.mjs当 --doctor 通过时的默认选项。从 assets/composition-template.html (或旁白解说片用 assets/collage-template.html) 开始;约定见 references/composition-contract.md。
Remotion / HyperFrames用户已经在此环境中工作。使用相同的账本和节拍表,但语法不同:references/backends.md。
工件预览仅当环境提供运动或视频工件类型时,并且仅作为预览;可交付成果仍然是渲染后的文件。
基板代码无法令人信服地绘制的镜头(人物、真实的运动场景)来自视频素材或视频模型生成的基板,不含文字;所有排版文字保留在合成中。references/backends.md。

地图、地球和路线:也阅读 references/maps.md (§7a 用于展示路线)。

在构建其余部分之前预览核心节拍:

node scripts/render.mjs comp/index.html --stills 0,170,last             # 海报帧, 核心帧, 结束帧
node scripts/render.mjs comp/index.html --range 150-210 --scale 0.5     # 以半尺寸预览核心节拍
node scripts/render.mjs comp/index.html -o comp/out.mp4                 # 完整渲染
node scripts/render.mjs comp/index.html --alpha -o comp/overlay.mov     # 带 Alpha 通道的 ProRes 4444

使用你的图像查看工具打开预览图像……

相关技能