FilmForge Deliver
一部影片只有当每个版本都能在指定平台上播放、测量正确,并且整个制作内容都放在一个文件夹里、附有完整的证明时,才算完成。此技能会根据交付物矩阵生成所有交付物,逐一检查,并最终使用 archive.py 关闭制作。
路径:本技能中的文件夹 scripts/、templates/ 和 config/ 位于技能的基本目录下(加载时显示),由 ./install.sh 放置其中。如果从仓库克隆工作,它们位于仓库根目录下的 tools/、templates/ 和 config/ 中。
步骤 1. 交付物矩阵(templates/delivery-checklist.md)
将其复制到制作文件夹中,划掉影片没有的交付物。每个影片交付物都来自一个母版,该母版从你的编辑器或合成器中以 3840x2160 分辨率导出,使用与预览相同的镜头列表、画作和混音,然后使用 ffmpeg 编码:
| 交付物 | 来源 | 设置 |
|---|---|---|
| 4K 母版 | 编辑器的 4K 导出 | 3840x2160,按镜头列表的帧率;通过 VAAPI 的 HEVC 编码(hevc_vaapi),固定 QP 18,标记为 BT.709,然后使用 -c copy -tag:v hvc1 重新封装以使 Apple 设备接受;无 VAAPI 时则使用 H.264(libx264,预设 medium,CRF 18,yuv420p);AAC 320k;+faststart |
| 1080p 上传版 | 母版 | Lanczos 缩放至 1920x1080,libx264 预设 slow,CRF 16,High profile,yuv420p;混音通过两遍线性 loudnorm 归一化至 -14 LUFS 和 -1.5 dBTP;AAC 320k;+faststart |
| 手机版 | 上传版 | Lanczos 缩放至 1280x720,轻度降噪(hqdn3d=1.2:1.2:3:3),libx264 码率 900k(最大码率 1400k,缓冲 2800k),AAC 128k;足够小,可通过聊天发送 |
| 封面 | 母版 | 3 或 4 个最强帧,4K 分辨率,PNG 格式,外加 JPG 格式用于上传;在手机尺寸下可读 |
精确的 ffmpeg 命令:references/deliverables.md。将它们放入一个脚本中,这样任何更改都会重建每个交付物。
当影片包含书籍和额外内容时:图片书(4K 和 1080p 视频配乐)、印刷版 PDF、可随音乐翻页的互动网页书、本地化版本(每种语言对应独立的 4K、1080p 和手机视频,每一行都由懂该语言的人重新设定和检查,绝不允许未经审查的机器翻译),以及幕后花絮(PDF 和手机版 PDF)。详细信息:references/deliverables.md。
步骤 2. 检查每个交付物
测量文件本身,而不是时间线:
- 流: 编解码器、尺寸、像素格式、帧率、编解码器标记(HEVC 母版为
hvc1)、音频采样率和声道数、长度、大小和比特率(ffprobe)。 - 响度: 整合响度、范围和真实峰值(EBU R128,使用 ffmpeg 的
ebur128过滤器)。母版保持混音原始状态;上传版和手机版必须约为 -14 LUFS。 - 故事节拍处的同步: 对于每个节拍,半秒内最大的画面变化和最强的声音起始,以及它们之间的毫秒差。画面变化来自 ffmpeg 的场景评分,声音起始来自在影片自身音频上运行的
beatmap.py。目标:节拍上若有剪辑,则控制在 1 帧(24 fps 下为 42 毫秒)或更少。若节拍上无剪辑,则报告一个间隙;需对照镜头列表阅读。 - 结尾: 第一帧和最后一帧(有意为黑屏或标题)。
- 联系表: 成品影片每 2 秒一帧的联系表,从头到尾查看。
- 亲眼观看一遍: 在目标屏幕上从开始到结束观看一遍并听声音,然后在签署前完成。
每个检查的命令:references/deliverables.md(Checks)。
对于 PDF:在至少两个阅读器中打开,检查每个页面展开,确保字体已嵌入,图像达到打印分辨率。
步骤 3. 档案及其证明
所有用于制作影片的内容都放入一个制作文件夹中:production.yaml、故事文件、提示词、每幅画作及版本、工作表、乐谱及其测量结果、代码、混音、交付物、经验教训。
python3 scripts/archive.py build <film> --require deliverables.txt \
--require-shotlist <film>/shotlist.yaml --paintings <film>/art/film \
--exclude "code/.venv/=rebuilt from requirements.txt"
python3 scripts/archive.py verify <film>
build 命令将每个文件哈希处理,生成 <film>/MANIFEST.sha256(纯 sha256sum -c 格式,因此证明不会受限于工具),并写入 manifest.json:文件数量、字节数、按类型分类的文件、故意排除项及原因(缓存、虚拟环境、任何 4k/ 升频文件夹)、必需的交付物和缺失项、没有画作的镜头以及清单本身的摘要。仅当每个必需模式都匹配且每个有画作的镜头都包含其画作时,才报告 COMPLETE。verify 命令稍后重新哈希所有文件,并在任何文件丢失或更改时(以及编辑过清单时)报告失败。
同样的工具也可用于证明较小的包。例如,The Lantern Moth 的 archive-required.txt 列出了其前期制作包在开始画作制作之前必须包含的内容;在示例文件夹上使用 --require archive-required.txt 运行 archive.py build 会发现所有十个模式都存在并报告 COMPLETE。
副本: 逐字节证明备份或移动的副本:python3 scripts/archive.py compare <film> <copy>。它用一个命令完成了手动执行时需要源文件和副本中每个文件的 SHA-256 列表以及复制日志才能完成的工作。
在档案中编写一个简短的 README:每个文件夹的内容、故意排除的内容、成品的位置。
步骤 4. 关闭
production.py signoff deliver --by <你> --note "<在电视上观看了母版;检查通过>",然后 advance 进入复盘阶段(forge-director)。
输出
film/文件夹,包含每个交付物,命名为<Title>_4K.mp4,<Title>_1080p.mp4,<Title>_phone.mp4,covers/- 报告中包含检查结果数据(大小、响度、每个节拍处的同步偏移量)
MANIFEST.sha256,manifest.json,档案 README
门控清单
- 矩阵中的每个交付物都存在并已通过检查
- 每个故事节拍处的同步偏差在一帧以内
- 已在目标屏幕上观看一遍并听声音
-
archive.py build:COMPLETE;archive.py verify:OK - 每个副本已通过
archive.py compare验证 - 已签署
修复表
| 症状 | 修复方法 |
|---|---|
| Apple 设备拒绝 HEVC 母版 | 缺少 hvc1 标签:使用 ffmpeg -i in.mp4 -c copy -tag:v hvc1 out.mp4 重新封装 |
| HEVC 母版无法解码 | 在 VAAPI 编码期间写入了 hvc1:不加标签进行编码,然后使用 -c copy -tag:v hvc1 重新封装 |
| 电视通过 Wi-Fi 播放卡顿 | 比特率过高(ffprobe 会显示):以更高的 QP(更小的文件)重新编码母版 |
| 需要 HEVC 但没有 VAAPI 编码器 | ffmpeg -h encoder=hevc_vaapi 和 ls /dev/dri 可查看机器支持情况;否则交付 H.264 母版 |
| 上传平台拒绝或剪裁 | 未归一化:上传两遍处理的副本(-14 LUFS,-1.5 dBTP,线性),而不是母版 |
| 手机版太大无法发送 | 从上传版以更低的 -b:v(references/deliverables.md)重新编码,或缩短时长;保持 720p |
| verify 报告 CHANGED | 有人编辑了已交付的文件:从已验证的副本中恢复,或重新构建并重新签署 |
| build 报告 INCOMPLETE | 缺少必需的交付物或画作:创建它,或从列表中移除并附上原因 |
参考
references/deliverables.md:完整的 ffmpeg 命令、检查方法、书籍、版本和封面