影片质量审核
你检查的是帧和数字,而不是意图。PASS 需要证据:你打开的文件路径或你测量的数值。
其他情况一律写 NOT CHECKED: <原因>。绝不要为没有看过或测量过的东西写 PASS。
路径(相对于 launch-video/,或 launchfilm 仓库中的 studio/):影片源文件 films/<slug>/ (film.json, STORYBOARD.md, BRIEF.md),渲染输出 out/<slug>/,QA 输出 qa/<slug>/(CLI 写入 report.md;你在它旁边写入 QA.md)。
精确的 CLI 标志:npx launchfilm <cmd> --help。经过语法测试的命令见:references/commands.md。
流程
- 自动检查。
npx launchfilm qa <slug>→ 先读取qa/<slug>/report.md(联系页、ffprobe、响度、自动检查项)。将其测量的数值复制到 QA.md 中作为证据;不要重复测量它已经测量过的内容。 - 联系页。 打开报告列出的每个联系页(或
npx launchfilm sheet <slug>)。阅读每个单元格。在 QA.md 中列出你打开的文件(T12 证据)。 - 静态帧。
npx launchfilm still <slug> <t> --preset <id>针对影片输出的每种预设,在以下时间点生成:每个镜头边界 + 6 帧、每个文字出现点 + 停留时间/2、第 0 帧、最后一帧、以及冻帧或黑帧扫描标记的每个间隔。再在关键文字帧上生成一张--scale 0.25(16:9 时为 480×270)的静态帧:X 时间线预览。读取每张 PNG。 - 测量 报告中未测量的内容:响度、真峰值、黑帧、冻帧间隔、剪切时间与节拍的对比、文字后的对比度、安全区、字幕行长度。命令见 references/commands.md。
- 阻断检查 下方的 T1–T12,然后交付检查 D1–D16。每一项都是 PASS / FAIL / NOT CHECKED + 证据 + 规则。
- 编写
qa/<slug>/QA.md,模板来自 references/qa-template.md。 - 修复循环。 任何 FAIL:将发现的问题连同帧编号交给 scene-build 或 sound,仅重新渲染受影响的区间(
npx remotion render … --frames=<a>-<b>或 CLI 等效命令),重新检查那些项目。最多两轮循环;然后向用户报告剩余的 FAIL,并附上静态帧。绝不要在缺少新证据的情况下将 FAIL 降级为 PASS。
阻断检查:12 个业余制作特征 (craft/00)
| 编号 | 通过条件 | 证据 |
|---|---|---|
| T1 静态 | 没有持续 ≥ 0.6 秒的冻帧间隔,除了片尾停帧(≤ 3 秒);每个标记的间隔通过其起始和结束位置的静态帧验证有漂移或运动 | freezedetect 输出 + 每个间隔 2 张静态帧 |
| T2 默认缓动 | grep G1 (scene-build) 在 films/<slug> 中为空;没有 CSS 过渡 | grep 输出 |
| T3 同时出现 | 每一组 ≥ 3 个兄弟元素分阶段进入(在联系页单元格中可见部分状态,或代码中每帧递增 ≥ 1 帧);组进入时间 ≤ 24 帧 | 联系页单元格引用或代码行 |
| T4 单一速度 | 影片 > 20 秒至少有 1 个节奏变化(静默、切黑、色调切换、停顿 ≥ 2× 镜头中位数);发布模式:每个剪切点离节拍 ±2 帧以内 | film.json 中的镜头边界与 beats.json 对比;检测到的剪切点 |
| T5 声音 | film.json 中每个视觉事件都有音效或被画外音/音乐覆盖;音乐在画外音下闪避;在计划处静音 | 带声音/无声音的事件计数;画外音窗口与纯音乐窗口的响度对比 |
| T6 文字作为标签 | 当文字是信息时(陈述句 10%),主要文字高度 ≥ 帧高的 8%;每个文字停留时间 ≥ 0.2 × (单词数 + 1) 秒;≤ 3 行;字幕 ≤ 2 行 | 每项一个表格 |
| T7 扁平外观 | 发布模式:颗粒 + 暗角存在;每个部分有一个命名风格处理;产品模式:发丝细节、柔和阴影;mp4 静态帧的最暗渐变中没有条带 | grep + 来自 mp4 的静态帧 |
| T8 网页布局 | 每张静态帧有一个焦点;没有段落 > 3 行;没有项目符号;仅在 chrome 是重点的地方使用 UI 装饰 | 静态帧 |
| T9 通用素材 | films/<slug>/footage/SOURCES.md 中每个素材片段都有来源 + 许可证;库存素材经过调色且剪辑长度 ≤ 1.5 秒 | SOURCES.md + 静态帧 |
| T10 装饰性过渡 | 过渡属于词汇表;非剪切过渡每 5 秒 ≤ 1 个;blur-dissolve ≤ 12 帧 | film.json |
| T11 模板优先于故事 | STORYBOARD.md 有 approved:;第 0 帧非黑,且与 0.5 秒处的静态帧不同;产品类别在 1.5 秒(横屏/竖屏)/ 1 秒(短视频)内清晰;问题之后有回报;结尾在品牌表面上至少有 2 秒的平静时间 | 第 0、0.5、1.5 秒及最后 2 秒的静态帧 |
| T12 从未看过 | 本次 QA:列出的每张联系页和静态帧都已打开 | QA.md 中的文件列表 |
| T1–T12 中的任何 FAIL 都会阻止渲染交付和打包。 |
交付检查(按预设;编号 = craft/08#delivery-checks)
值来自 harness.config.json presets,否则来自 craft/10#presets。使用这些确切的编号;craft/08 和 QA.md 共享它们。
| 编号 | 通过条件 |
|---|---|
| D1 | 视频 h264,profile High(Remotion 的 ffprobe 输出 100),pix_fmt yuv420p,容器 mp4 |
| D2 | 宽度 × 高度精确等于预设值 |
| D3 | 恒定 fps = 合成 fps(r_frame_rate = avg_frame_rate) |
| D4 | 时长 = film.json ±1 帧,且在预设的时长范围内(x-16x9 ≤ 140 秒,reel-9x16 ≤ 90 秒) |
| D5 | 音频 aac LC(Remotion 的 ffprobe 输出 1),48000 Hz,2 声道,~192 kbps;hero-loop:无音频流 |
| D6 | 综合响度 −14 ±1 LUFS;真峰值 ≤ −1.5 dBTP;画外音 −16…−14 LUFS(可测量时) |
| D7 | moov 在 mdat 之前(faststart) |
| D8 | 该预设的第 0 帧海报存在,大小相同,非黑(YAVG > 20),显示钩子 |
| D9 | 每个有画外音的预设旁边有 SRT 文件;与字幕相同的短语;HH:MM:SS,mmm 格式;≤ 2 行;每条 ≥ 0.8 秒;时间 ±2 帧 |
| D10 | 重要内容(字幕、文字、标志、正在使用的 UI)不在预设的安全区之外(叠加静态帧) |
| D11 | 每个有画外音的预设上烧录字幕(hero-loop:无,ph-16x9 按配置);≤ 2 行;≤ 42 字符/行(16:9),≤ 32(4:5、1:1、9:16);绝不覆盖正在变化的元素;字幕和文字在素材上的对比度 ≥ 4.5:1,强调色在背景上 ≥ 3:1;在 480 px(16:9)和 360 px(4:5、9:16)宽的静态帧上可读 |
| D12 | 冻帧和黑帧列表仅匹配设计好的停留和黑帧节拍(列在 film.json 或 STORYBOARD 中) |
| D13 | BT.709 标签或未标记的高清;mp4 静态帧中最暗渐变与 PNG 相比没有显示新的条带 |
| D14 | 文件大小在限制内:x ≤ 512 MB,README hero ≤ 10 MB |
| D15 | out/<slug>/credits.txt 列出每个 CC BY 资产及其署名行;films/<slug>/footage/SOURCES.md 完整 |
| D16 | 仅 hero-loop:第 N 帧等于第 0 帧;3 次循环的文件在接缝处没有跳跃 |
文字在时间点上的可读性
对于 film.json 中的每个文字项(陈述句、字幕、标签、画外音指向的 UI 文案):单词数、入/出帧、停留时间 = (出 − 入) / fps,所需时间 = 0.2 × (单词数 + 1) 秒。还要在 480×270 的静态帧上检查主行是否仍然可读(字母可分辨)。在 QA.md 中每项占一行。
报告规则
- 每个 PASS 引用证据:
qa/<slug>/stills/x-16x9-12.30.png,I = −14.2 LUFS,grep G1: 0 lines。 - 测量数值保留单位及其生成工具(
system ffmpeg 8.1 ebur128或remotion ffmpeg loudnorm)。Remotion 捆绑的 ffmpeg 缺少ebur128、signalstats、freezedetect、tile、drawbox和 rawvideo 输出:对这些使用系统 ffmpeg 并注明;如果没有系统 ffmpeg,则这些项标记为 NOT CHECKED。 - FAIL 指明帧范围、规则(
craft/NN#anchor或T#/D#)和建议的修复方案。 - 摘要块仅在 T1–T12 和 D1–D16 全部为 PASS 时写 READY(D16 仅对 hero-loop 检查)(NOT CHECKED 视为未就绪,并注明原因)。