视频 QA —— 发布门控
视频不是在渲染完成后就大功告成;只有经过探查、在联系图上被看到并归一化后,才算真正完成。本技能适用于任何文件,独立于其生成方式。
1. 探查事实(永远不要依赖假设)
scripts/probe.sh video.mp4
将每个值与预期值(时间线、简报、平台规格)进行比较:
| 检查项 | 预期值 |
|---|---|
| 时长 | 原始时长 ± 0.1 秒 |
| 帧率 / 分辨率 | 原始帧率 / 宽×高 |
| 编码器 / 像素格式 | h264 / yuv420p(yuvj420p 为全范围变体,通常可接受) |
| 音频流 | 存在(当且仅当视频应有声音) |
| 综合响度 | −14 ± 2 LUFS(社交平台通常会归一化至接近 −14) |
任何不匹配都是渲染错误,而非品位问题。修复上游问题,重新渲染。
2. 响度:测量 → 归一化(仅音频,耗时秒级)
# 测量
ffmpeg -hide_banner -i video.mp4 -af ebur128 -f null - 2>&1 | awk '/Integrated loudness/{getline; print}'
# 归一化至 −14 LUFS(视频流复制,无需重新编码)
ffmpeg -i video.mp4 -c:v copy -af "loudnorm=I=-14:TP=-1.5:LRA=11" -c:a aac -b:a 192k video_norm.mp4 \
&& mv video_norm.mp4 video.mp4
切勿通过耳朵使用音量滤镜进行归一化——LUFS 才是平台实际使用的单位。
3. 查看视觉:联系图 + 条带
scripts/contact_sheet.sh video.mp4 contact.png 2 8x # 每 0.5 秒一帧,8 列
# 围绕关键时刻(例如 T 处的转场)的 12 个连续帧:
ffmpeg -y -ss <T-0.2> -i video.mp4 -frames:v 12 -vf "scale=320:-1,tile=6x2" strip_T.png
像放映胶片一样阅读联系图:节奏是否可见?剪辑是否落在拍点网格上?任何场景是否空荡或过于拥挤?联系图会隐藏运动质量——在签字确认前,务必至少完整观看一遍视频。
4. 审查环节(构建者 ≠ 评判者)
审查的是渲染结果——而非源文件或预期效果——每项评分 /10:
- 钩子——前 2 秒内有最引人注目的帧吗?
- 可读性——文本是否 ≥ 最小尺寸、位于安全区域内、无重叠/被裁剪、持续时间足够长?
- 动效——是否完全没有线性缓动、多属性入场、错落效果、退场速度是否快于入场速度?
- 同步——事件是否落在拍点/单词网格上?
- 风格一致性——是否使用同一色系、同一字体系统、统一的转场效果?
- 声音——旁白清晰、音乐音量降低、目标响度达标、无削波?
协议:记录最差的 3 个缺陷并附带时间戳 → 精确修复这些缺陷 → 重新渲染 → 重新评分。每个方面达到 ≥8/10 通常需要 3–5 轮。请在全新的上下文(或子智能体)中运行审查:代码的作者往往是代码最差的审查者。
5. 确定性(适用于生成/可重复视频)
# 同一输入的两次指纹必须逐字节匹配
ffmpeg -i video.mp4 -map 0:v -f framemd5 - | sha1sum
相同的流水线、相同的输入 → 不同的哈希值意味着存在隐藏的挂钟时间、未初始化的随机性或累积状态:修复生成器,而不是“重新抽卡”。
6. 交付检查清单
video.mp4 H.264, yuv420p, +faststart, −14 LUFS
poster.png/jpg 钩子帧
contact.png 每秒 2 帧的胶片条
sources 生成视频的任何源文件(可编辑 > 最终版)
明确告知用户要更改某个内容时应编辑哪个文件,以及重新渲染的命令。
证据规则
当审查者(无论是人类还是视觉模型)声称存在几何缺陷(“文本被裁剪”、“元素重叠”)时,请通过测量(播放器检查、像素采样或生成代码自身的度量)进行确认,然后再“修复”一个非缺陷。审查者幻觉边距的频率远高于渲染裁剪文本的频率。