# 任意长度的影片

一部影片的长度是 `meta.durationFrames`，这个数字来自故事，永远不来自模板。三分钟、五分钟、二十分钟：引擎逐帧流式输出，闸门逐帧测量，没有任何东西会把整部影片缓冲下来。随长度变化的，是你组织工作的方式。

## 约 90 秒以内：一条弧线

就按[入口页](../../index.md)里写的影片工作流来：三句话（铺垫、转变、回报），一个会重新出现的信物，一张 cue 表，一张定调静帧，一段音乐小样，从头到尾做完。

## 更长：分章节

长影片是一串章节，每章有自己的小弧线，由一条主线串起来。

1. **先写骨架**：用一句话写出主线，然后每章写一行（这一章里什么发生了变化）。如果一章什么都没改变，就删掉它。
2. **每章一张 cue 表，外加一张总表**来安排各章的位置。章节表用本章内的帧号；总表加上偏移量。给某一章重新定时会挪动它之后的一切，检查器在加载时对两个层级都会运行。
3. **一份画风契约**（项目里的 `STYLE-GUIDE.md`），在开始并行工作之前定好：配色、成片尺寸下的线宽、每种形状的字号、各角色的模块、音乐风格及其各段的情绪。各章导入它；谁也不私下改它。
4. **转场承载故事**：每一章都用匹配剪辑、遮挡切换（一个形状经过、翻过一页、一团雾浓到最浓）或一件共享的信物交接给下一章。每两章之间都硬切到黑场，那就是幻灯片。六种机制以及各自适用的场合，见 [references/motion-grammar.md](../motion-grammar.md)。
5. **音乐跟随章节**：一个主题，按每章的情绪变奏（见 [references/music/](../music/index.md)），转场也要配乐（声音提前进入的 pre-lap、枢轴和弦、织体交接）。
6. **先逐章审，再完整审一遍**：每章一张联系表，每拍一格；然后把整部影片完整看一遍，有声和无声各看一次。

## 渲染长作品

- 把各章作为独立的影片并行渲染（每部影片用 `--workers`，每两个机器核心跑一部影片），再用 ffmpeg 的 concat demuxer 把各段 MP4 拼接起来。每一章单独拿出来仍然可以精确复现。
- 片子越长，绘制预算越要紧：把画完的图层缓存起来，缓存键要写明其像素所依赖的一切，并且让单帧绘制时间的中位数远低于 150 ms。
- 闸门的冷场检查一次只读一小帧，所以一部二十分钟的影片花的是时间，不是内存。
