# 发布片与产品视频

发布片就一个产品许下一个承诺，并展示这个承诺被兑现。它是一部有任务的短片：开头几秒观众就知道这东西是什么，看到最后就知道去哪里拿到它。下面每一条规则都是在 anidoodle 自己那部 77 秒的发布片（剪了四版）上付过代价换来的，并对照已公开发表的发布片制作经验核对过。可复用的零件在 [launch-video-kit.md](launch-video-kit.md)；一部模板影片能根据数据为任何产品渲染出一部 16 秒的发布片。

## 对方带来的素材

产品截图、logo、UI 截取图、仓库链接、功能清单、准确的安装或注册命令。他们带来的图片可以嵌入（用 sha256 钉住，来源写在清单文件里）；图片周围的一切都用代码画。绝不生成或抓取图片。

## 先扎根于真实的产品

在画任何分镜之前，先写一份注明出处的简短 brief，并就它拿到**一次**审批。凭空编造主题的发布片，画出来的是产品的吉祥物，而不是产品本身。

1. **读真东西。** 他们带来的截图和截取图、仓库的 README 和 UI 组件、线上页面。记下观众应该能在屏幕上认出来的两三个**真实**功能、准确的产品名称和标志、品牌色的十六进制值。
2. **收集获准的说法。** 一句话的承诺和任何数字都来自他们自己的材料（网站文案、发布说明、README），每一条旁边都注明出处。凡是你找不到出处的，都变成一个问题，而不是影片里的一句话。列出影片**绝不能**做出的宣称。
3. **问扎根问题**，放在一条消息里：展示哪些功能（推荐你选的那三个）、交付哪几种画幅、在哪里播放、准确的 CTA 文案。
4. **写 brief**，放在影片文件所在的地方：产品和承诺、功能及其出处、品牌色映射到调色板的各个角色、获准和禁止的说法、画幅、平台。分镜和屏幕上的每一个字都引自 brief，绝不凭记忆。

## 为这个产品而做，每一帧、每一个音符

影片的画面按 brief 选定的画风配方（[references/style-guide.md](../style-guide.md)），为这个产品的主题而画；它的配乐为这份 brief 而作。anidoodle 自己的样张和曲子是手艺的示例，绝不是别人影片的素材。

## 故事

- **影片要证明的一句话**，在其他任何东西之前先写下来。anidoodle 的是：「你可以用纯代码做出图像、插画、循环动画、动画和影片。」每一拍都为它服务。一排功能是一张规格表，不是故事。
- **从用户的视角讲**：他们输入，按下按钮，结果出现。观众应该能想象自己正在这么做。
- **前五秒说清它是什么**（anidoodle：最迟在 10 秒前说出「没有图像模型，只有代码」）。钩子在 2-3 秒内落地，并且在声音**关闭**时也能看懂：信息流是静音自动播放的。
- **弧线**：钩子、一个核心交互、快速证明能力范围（一面墙，绝不是慢吞吞的参观）、品牌时刻、号召。每 3-5 秒给一个视觉上的回报；没有冷场的等待。
- **屏幕上没有脚注、没有眉题文字、没有终端行话**，除非产品本身就是终端工具。

## 文字

- **默认让文字拥有自己的空间。** 一个词拥有自己的整个画面：一团墨晕打开，一支画笔写出这个词，墨晕在下一个场景上收拢（`typeFrame`）。或者，对于功能拍，给它自己的**一栏**：文字在左，实时 UI 在右（在手机上文字在上、UI 在下），各占布局里属于自己的区域（`split`），比整页文字页更快。镜头把 UI 移到角标下面时，角标会让开；在手机画面上，角标待在属于自己的一条区域里。
- **文字压在画面上是一种判断，而答案通常仍然是不。** 只有下面这些全部成立时，它才配得上这个位置：文字下面那块画面是平静的（平坦或安静，没有东西从字母间穿过）；这个词属于这个场景（贴在它所指之物上的标签、一个标注、一行与画面一起构图的动态文字，而不是扔在上面的一条字幕）；这一帧能当海报用；关掉声音也能看懂。绝不压在人脸、产品的 UI、这个镜头所讲的细节或繁杂的纹理上。用最小交付尺寸的审查静帧检查它。拿不准时，让这个词拥有自己的画面。
- **每个画面 3-7 个词，画面要少。** 把文字卡片合并成先主张、后证明（先「JUST CODE.」，再「32 STYLES」）；卡片越少，留给证明的时间就越多。
- **每个定住的词停留 0.5 秒或更久**，主张停留得更久。
- **在审查静帧里评判设计，而不只是看有没有碰撞**：层级、间距、这一帧能不能当海报用。一帧里什么都没重叠，照样可能很丑。

## 运动

- **默认的转场是一个轻柔的移动**：晕开、卡片翻转、推移、卡片**变大**进入画面。缓入缓出；镜头见 [references/camera.md](../camera.md)。
- **硬切是一种判断。** 它在匹配时才成立：两侧有相同的形状、位置或运动方向，或者在一首能量需要它的曲子里切在一个有力的拍子上。一个什么都没带过去的切，以及任何尖锐的嗖声，看起来仍然像幻灯片。
- **设计好的接缝同样是一种判断。** 让下一个画面从当前画面里长出来的六种方法，每一种都写明了什么时候合适、什么时候不合适：[references/motion-grammar.md](../motion-grammar.md)。只在它的条件明确成立时用其中一种；否则就用轻柔的移动。
- **画的过程以真实时间的 3-6 倍速播放**；循环动画要停留得够久，让人看得出它在循环。
- **活着意味着真实的运动**：锦鲤游过一个滚动的世界，而不是原地播放的 GIF（[start-here.md 的「『活的』意味着真正的运动」一节](start-here.md#alive-means-real-motion)）。
- **聊天是一条真实的对话流**：请求在它的结果**之前**出现，之前的回答保留，对话流会滚动，追问在现有的卡片里以动画呈现，而不是弹出一张新卡片。
- **网页**：先展示整个网站，再推近每一次点击；网站的文案描述观众正在看到的东西。
- **不是聊天类的产品，展示它自己的 UI**，根据它的真实数据画出两种状态：before（问题），按一次它的动作按钮，每个条目以弹簧动画移到 after。绝不是截图幻灯片（`productUI.ts`，一个 `kind: "ui"` 请求）。

## 动机

**只挑一个故事里本来就有的物件，带着它跨过接缝**：anidoodle 的模板带的是那滴墨，每按一次 Generate 都会把它送进对话流；结尾时它最后一次从 Generate 上升起，落下成为片尾卡标志（"NAME."）里的那个点，片尾卡**从**它晕开。对任何你设计成匹配剪辑的接缝，规则是：在出画镜头的最后一帧和入画镜头的第一帧，这个物件在屏幕上的位置和大小相同（误差 2 px 以内），并且入画的场景从它展开。`motif.ts`（`relay`、`checkRelay`）会检查这一点；跳了的接缝会抛错。把它用在要紧的接缝上（揭晓），绝不用在每一个切点上。

- 禁用的默认做法：渐变背景上居中的标题、所有东西都淡入、弹跳的缓动、粒子爆发、UI 外框发光、冷场、缩放到模糊的文字。

## 两种基调

**手绘**基调（默认）：墨晕、手写文字、暖色纸张调色板、用选定画风画出的产品。**简洁**基调（`preset: "clean"`）用于 UI 优先的产品：安静的画布、**一种**强调色、字体排印本身就是设计（排出来的，不是写出来的；每个词升到位）、圆形光圈接缝、产品自己的 UI。每部影片挑一种；绝不混用。

## 品牌与片尾卡

- **logo 反复出现**：每一帧都有一个小角标（`logoBug`），而不是只在开头出现一次。
- **片尾卡为这个画面构图**：名字、一句话、放在一块面板里的准确安装命令，停留 **3 秒或更久**，让观众来得及截图。anidoodle 的是这两行：`/plugin marketplace add alexgreensh/anidoodle` 和 `/plugin install anidoodle@alexgreensh-anidoodle`。只有一个主要号召；链接用更小的字放在下面。

## 声音

- **音乐先行，先由人听过 mp3**，再拿它给任何东西配乐（你自己听不见）。为**这个**品牌作曲：根据 brief（能量、受众、在哪里播放）挑选风格，并为每一段挑选情绪，然后写出音符（[references/music/compose.md](../music/compose.md)）。anidoodle 自己的发布片选的是 chill lo-fi 电子乐，这只是一个示例（[references/music/styles/lofi-electronic.md](../music/styles/lofi-electronic.md)）；绝不复用我们的配乐或现成的曲库音乐。
- **按分轨 RMS 做平衡，而不只看 LUFS**：综合响度 -14 LUFS 曾经掩盖过一条超低音偏响 7-10 dB 的问题。
- **切在强拍上，而不是每一拍都切。** 让主张落在一个和弦上（launch3 的落在第 26 小节，主和弦）；`beatGrid().solve()` 会调整一个可伸缩片段，让它做到这一点。
- **音效来自画面自己的数学**，绝不手工铺上去：每输入一个字符一声按键，按钮按下去的那一帧一声按压，墨滴和它的晕开，卡片在它的弹簧第一次到位时落定，每一个都按它在屏幕上发生的位置做声像定位（`launchSound.ts`）。每个 cue 都必须能在配乐之上被听见（模板会调高被淹没的 cue，然后检查）。
- **转场音效只用在真正改变方向的地方**：进入大揭晓时一个上升音效，揭晓那一刻一个冲击音效，绝不在每个切点上都来一声呼啸，文字页上什么都不放（[references/music/sound-design.md](../music/sound-design.md)）。
- **母带处理到综合响度 -14 LUFS、真峰值 -1 dBTP 或更低**，然后用手机扬声器听一遍。

## 交付

- **时长**：发布帖（LinkedIn、YouTube、README）约 60 秒；X 上 15-45 秒；为每个平台剪一个版本，而不是把一个母版推到所有地方。按整拍剪；绝不把整部影片加速（那会破坏节拍网格，而且看起来很赶）。
- **画幅**：`16x9` 用于 YouTube 和网站，`1x1` 或 `4x5` 用于信息流，`9x16` 用于 Reels 和 Shorts。从同一条时间线为每种画幅重新构图；绝不裁切宽画幅的渲染结果。模板通过 `launchLayout.ts` 做这件事（`launch.mjs ship <film> --shapes 16x9,1x1,9x16`），文字对手机安全：在手机画幅上，观众读的每一行在横向 1080 下至少 32 px。
- **字幕**：信息流是静音自动播放的。给支持外挂字幕的播放器（YouTube、LinkedIn、网站）提供 `.srt`/`.vtt`；对不支持外挂字幕的信息流，把字幕烧进画面下方属于它们**自己**的一条字幕带里（`captions: "burn"`），绝不压在画上。
- **同步和峰值在你交付的文件上检查**，而不是在母版上：每个同步标记处的声音与混音相差在 1 ms 以内，AAC 编码之后真峰值不高于 -1 dBTP（`verify-export --delivery`）。
- **UI 多的影片可以跑 60 fps**（`fps: 60`）；用 `--blur auto` 渲染，让快速的移动按它们真实的速度模糊，静止的帧保持清晰。
- **第一帧就是缩略图。** 平台和播放器在播放前显示第 1 帧。让它清晰可读、符合品牌（anidoodle 的是那面画风墙；模板的是提示词，大字，句子写到一半）；绝不是一片空白、从黑场淡入，或者一整个小到读不清的聊天窗口。如果故事开头很安静，就用 `--poster-frame N` 渲染（第 0 帧显示第 N 帧，到第 6 帧时溶解进开场），并且只交付通过 `verify-export --delivery` 的文件。

## 流程

1. **故事句**和注明出处的 brief。✋ 一次审批。
2. **分镜**：每拍一行，写明它以拍计的长度、文字、转场。
3. **选项表**：把转场和文字样式并排放在一张成本很低的静帧表上（比如三种墨晕、三种书写媒介）。由对方挑选；这时还什么都不做完整渲染。
4. **每个场景一张静帧**，以 0.3-0.5 的比例放在一张缩略拼图（contact sheet）上，从设计角度审查：`still.mjs <film> --frames 0,240,610 --sheet out/scenes.jpg` 在一个浏览器里把它们全部画出来（[references/working-method.md](../working-method.md)）。
5. **把音乐做成 mp3 放在页面上**，由人来听。✋ 审批。
6. **剪辑即数据**：内容场景放在一条时间线上，剪辑是节拍网格上的 `pic`/`type` 片段（`launchCut.ts`）。重新调整时间只改这个列表，绝不改场景代码。
7. **从渲染结果审查**：每拍一张缩略拼图，切点按前后成对来看，先看**设计**（文字压在画上、间距、层级），再看时间。只渲染改动过的区间（`render.mjs --from F --to T` 写出 `out/<film>.<F>-<T>.mp4`，无声）。用镜头语言给意见（「把这个推近放慢到 0.7 倍」、「这个词多停 10 帧」），绝不说「弄好一点」。
8. **QA**：对照 [launch-video-kit.md](launch-video-kit.md) 里的设计清单，审查每一种画幅的缩略拼图（文字不被裁切、内容不被边缘裁掉、每种画幅构图均衡、内容前后一致）。`launch.mjs ship <film> --shapes ... --gate` 对**每一种**交付的画幅运行 `framecheck`（每一帧上文字和卡片都完整）、闸门（确定性、契约、冷场；在 `meta.holds` 里声明真正的停留，每一个都写明理由）和 `verify-export --delivery`（尺寸、帧数、配乐、同步、真峰值、清晰可读的第 0 帧），并写出封面图和字幕；要检查品牌色，再加上 `verify-export <film>-<shape> --first-frame #rrggbb`。给混音做响度测量。随着工作推进，持续更新审查页面。
9. ✋ 对成品文件做**最终审批**。
