lhg-mv-deliver:导出与质检
目标:导出的每一字节都经得起播放器和平台的毒打。 核心纪律:先跑脚本(机器),再做评审(人);blocker 不清零,不许说可发布。
1. 何时使用
- 导出成片:按第 3.1–3.2 节
- 适配多平台:看第 3.3 节规格表
- 发布前:跑第 5 节自查全流程
2. 输入 / 输出
输入:渲染帧序列 + 混音后音频 + film.json。
输出:out/final.mp4 + captions.srt(如有)+ 自查报告。
3. 分步方法论
3.1 导出命令(记住这串参数)
ffmpeg -framerate 30 -i frames/%04d.png -i audio.wav \
-c:v libx264 -pix_fmt yuv420p -crf 18 \
-vf scale=1920:1080 -c:a aac \
-movflags +faststart -shortest out/final.mp4
每个参数为什么在:
| 参数 | 作用 | 缺了会怎样 |
|---|---|---|
-pix_fmt yuv420p | 像素格式兼容 | QuickTime 偏色/黑屏(blocker) |
-crf 18 | 画质(16–23 合理) | 太大糊、太小文件巨大 |
-movflags +faststart | moov 前置 | 网页播要等下完才开始 |
-c:a aac | 音频编码 | 部分播放器静音 |
-shortest | 音画同收 | 结尾多一截黑屏 |
-vf scale= | 分辨率锁定 | 和 film.json 对不上被拉伸 |
3.2 导出前检查单
- film.json 四要素与渲染/导出三处一致(宽高/帧率/时长)
- 素材全本地化,无外链
- 音频已混音,响度 -14 LUFS
- 字幕 srt 无重叠、无超长行,安全区已声明
- probe/ 静帧与成片抽帧一致(没偷换)
3.3 多平台规格速查
| 平台 | 画幅 | 时长建议 | 备注 |
|---|---|---|---|
| B 站/视频号横屏 | 1920x1080 | ≤3 分钟 | 完播率生命线 |
| 抖音/小红书竖屏 | 1080x1920 | 15–60 秒 | 前 3 秒定生死 |
| 朋友圈/信息流 | 1080x1080 | ≤60 秒 | 静音播放多,字幕必备 |
一源多发:横屏母版优先,竖屏版重排分镜(不是简单裁剪——裁剪会切掉字幕和主体)。
3.4 封面帧
- 在 film.json 或 brief 里指定封面时间点(通常是高潮记忆点帧)。
- 封面帧单独导出一张高清图,平台缩略图用它,不许用随机帧。
4. 反模式
- ❌ 导出参数凭记忆手打——背下 3.1 那串,或存成脚本
- ❌ 缺 yuv420p"先发了再说"——部分用户黑屏,口碑崩了补不回来
- ❌ 竖屏版直接裁横屏——字幕和主体一起被切,等于重做
- ❌ 从没在手机上播过成片——偏色/卡顿自己都不知道
- ❌ 画面数据是编的——示意数据必须标示意,用假数据冒充真实是红线
5. 自查流程(发布前必跑)
第一步:跑确定性审计脚本(必做,零 LLM 成本)
python3 <插件目录>/scripts/audit/motion_audit.py --target <影片目录>
- 28 条规则:manifest 4、渲染 7、字幕 5、导出 6、素材 4、brief 2。
- 有 blocker 时脚本以非零 exit code 退出——这是设计,不是 bug。
--fail-on控制 exit code 语义:默认blocker;想要更严可设为warning。
第二步:分级
| 级别 | 定义 | 处理 |
|---|---|---|
| blocker | 成片会翻车:尺寸/帧率不一致、缺 yuv420p、字幕重叠、素材缺失 | 必须修,不修不许发布(commit 前 hook 会拦截) |
| warning | 大概率是坑:无探针、无拍点、crf 越界、外链素材 | 本次修掉;修不掉写理由进报告 |
| nit | 洁癖项:缺 title、文件名不规范、缺 shortest | 顺手修 |
第三步:人工评审(脚本覆盖不到的)
- 视觉:探针静帧与成片一致;转场抽看前后 5 帧,无闪帧
- 听画:转场音效落在拍点 ±0.1s;音乐高潮对上视觉高潮
- 诚实:画面数据/功能真实;示意数据已标注
- 播放:手机+电脑实际播放一次,无偏色、无黑屏开头、无卡顿
- 字幕:无平台 UI 遮挡(安全区内)
第四步:输出报告
# 自查报告:<片名>(日期)
## 结论:可发布 / 不可发布
## blocker(n):已修 n,剩余 n
## warning(n):已修 n,豁免 n(理由)
## nit(n)
## 人工评审:x/y 通过
## 需人工处理
6. 常见问题
Q:导出的 mp4 在 iPhone 上偏色?
A:99% 是缺了 -pix_fmt yuv420p。补上重导,这是 QuickTime 的硬要求。
Q:文件太大传不上去? A:先把 crf 从 18 提到 21(画质损失肉眼难辨,体积降约 40%);再不行降帧率到 24fps。别降分辨率——糊了回不来。
Q:网页播要等很久才开始?
A:缺 -movflags +faststart。moov box 沉底了,补上重导即可,不用重渲染。
7. 自检与反馈
每次执行完本 skill,做一次轻量自检:
- 脚本是否真的跑了?→ 没跑不算做。
- blocker 是否清零或全部列入"需人工处理"?
- 人工评审是否逐项打勾且有依据(含实际播放验证)?
标准冒烟用例:对插件自带的 fixtures/ 跑脚本,确认坏 fixture 的 blocker 全命中、好 fixture 零 blocker(见仓库根 smoke_test.py)。
反馈渠道:以 [QC] <一句话问题> 为标题提交到 https://github.com/lhg-plugs/lhg-motion-video/issues,正文写清"输入 → 错误输出 → 期望输出"。规则误报/漏报请附最小复现用例。
出品:刘洪光
本 skill 由真人出镜 IP「刘洪光」(安徽合肥)出品,归属 lhg-skills。
- GitHub 主页:https://github.com/lhg-skills —— 全部 skill 开源在此,欢迎 star
- 视频号:搜「刘洪光实名上网」
- 微信:lhgsmsw