本节摘要:门禁是流水线的海关:每个阶段出口设卡,检查通过才放行进入下一阶段。本节先立建制——自动检查守下限(时长、分辨率、音量、黑帧四类),人工抽检守上限(好看不好看机器说了不算);四类自动检查逐一讲清检查什么、用什么量、怎样算过,并给出汇成一体的 gate_check.py,退出码即放行信号,可直接挂进第 8.1 节技能验收与第 9.3 节任务队列;随后说明门禁不是新发明,而是前九章检查的收编:字幕校验(7.2)、对齐校验(6.3)、校验和(8.3)都登记为门禁项;人工抽检点给出比例与看点的对照表;最后是质量分台账——每条片一张评分卡,趋势看板让"最近片子变水了"变成可查的数据问题。门禁失败的处理流以"定位阶段、最小重跑"收束。
门禁设在阶段出口而非入口:进入下一阶段前验上一阶段的产物,保证流水线里流动的东西永远是合格的。分工遵循第 8.1 节的生成与把关分离:自动检查处理一切机器可判定的(时长够不够、分辨率对不对、响度在不在带内、有没有黑帧),人工抽检处理机器判不了的(节奏是否拖沓、情绪是否到位)。自动项追求全查零遗漏,人工项按风险抽样——两者都不缺位,也不越位。
门禁在流水线上的位置(阶段出口设卡) 剧本 ─▶│卡1│─▶ 分镜 ─▶│卡2│─▶ 镜头 ─▶│卡3│─▶ 粗剪 ─▶│卡4│─▶ 成片 ─▶│卡5│─▶ 交付 结构完整 首尾帧标注 四类自动检查 时长/对齐 门禁全家桶 台词字段 时长分布 逐镜头验收 转场完整 加标识核对
时长:实测时长与计划值的偏差在容差内(成片级),单镜头不低于台词时长(镜头级,即第 6.3 节校验)。分辨率:统一目标(如竖屏一千零八十乘一千九百二十),混入横屏素材立刻暴露。音量:loudnorm 测量整片综合响度,落在目标带内(目标带以各平台现行规范为准,参照 6.2 节)。黑帧:blackdetect 检测连续暗场——生成视频常见的"黑尾"(生成时长不足时尾部补黑)与转场失误都靠它抓。
# gate_check.py —— 成片质量门禁:时长/分辨率/响度/黑帧四项自动检查 import json, re, subprocess SPEC = {"duration_s": 60.0, "dur_tol": 2.0, "width": 1080, "height": 1920, "lufs_min": -16.0, "lufs_max": -13.0} def ffprobe_streams(path): cmd = ["ffprobe", "-v", "error", "-show_entries", "format=duration:stream=width,height", "-of", "json", path] return json.loads(subprocess.run(cmd, capture_output=True, text=True).stdout) def measure_lufs(path): cmd = ["ffmpeg", "-i", path, "-af", "loudnorm=print_format=json", "-f", "null", "-"] err = subprocess.run(cmd, capture_output=True, text=True).stderr found = re.search(r'"input_i"\s*:\s*"(-?[\d.]+)"', err) return float(found.group(1)) if found else None def detect_black(path): cmd = ["ffmpeg", "-i", path, "-vf", "blackdetect=d=0.3", "-an", "-f", "null", "-"] err = subprocess.run(cmd, capture_output=True, text=True).stderr return [line for line in err.splitlines() if "black_start" in line] def main(video="deliverables/final.mp4"): info = ffprobe_streams(video) visual = next(s for s in info["streams"] if "width" in s) lufs = measure_lufs(video) checks = { "时长": abs(float(info["format"]["duration"]) - SPEC["duration_s"]) <= SPEC["dur_tol"], "分辨率": (visual["width"], visual["height"]) == (SPEC["width"], SPEC["height"]), "响度": lufs is not None and SPEC["lufs_min"] <= lufs <= SPEC["lufs_max"], "黑帧": len(detect_black(video)) == 0, } for name, ok in checks.items(): print(f"{name}: {'通过' if ok else '未通过'}") raise SystemExit(0 if all(checks.values()) else 1) if __name__ == "__main__": main()
退出码是门禁与流水线的接口:零放行、非零拦截,第 9.3 节的 worker 与第 8.3 节的续跑逻辑只看这一位信号,不需要解析输出文本。阈值全部来自 config(第 11.2 节的单一配置源),换平台变体时改配置不改代码。
四类之外,前面各章的校验全部登记为门禁项:镜头级时长校验(第 6.3 节 check_alignment)、字幕静态校验(第 7.2 节 validate_cues)、素材许可校验(第 8.2 节 check_assets)、产物校验和(第 8.3 节 manifest)。收编的原则是"一检查一登记":每个检查脚本保持独立可跑,门禁只负责按阶段调用并汇总结果。这样检查逻辑只有一份实现,门禁层永远只做编排——与技能体系的分层(第 8.1 节)同构。
| 门禁项 | 来源 | 阶段出口 | 通过判据 |
|---|---|---|---|
| 镜头时长对齐 | 6.3 节 | 镜头 | 视频时长不低于台词时长减容差 |
| 素材来源许可 | 8.2 节 | 素材 | 登记齐全且许可明确 |
| 字幕静态校验 | 7.2 节 | 字幕 | 无重叠无越界不超字数 |
| 产物校验和 | 8.3 节 | 合成 | manifest 与磁盘一致 |
| 四类自动检查 | 本节 | 成片 | 全部通过 |
自动检查全绿仍可能是"难看的合格品":时长达标但节奏稀烂,分辨率正确但主体畸形在容差外被放过。人工抽检点按阶段布防:
| 阶段 | 抽检对象与比例 | 看点 |
|---|---|---|
| 剧本 | 每条必审 | 逻辑、敏感点(9.1 节检查点一) |
| 镜头 | 首尾镜头全查,中间两成抽样 | 语义、一致性、技术 |
| 成片 | 每条一次一点二五倍速快放 | 节奏、音画、字幕观感 |
| 新模板或新题材首条 | 各环节全查 | 连锁反应 |
抽检结果回流两处:打回原因进废片台账(第 10.2 节分类),漏检事故回头评估自动项要不要加规则——某类问题连续两周被人抓到两次,它就该变成一条自动检查。这是门禁体系自我生长的机制。
每条成片交付前打一次分,评分卡五维各一到五分:叙事节奏、画面质量、音画同步、字幕规范、合规完整。评分记录进 quality_log,附一条总评与主要扣分原因。单条分数用处在招聘式的"过与不过",趋势才是真正的消费对象:周维度画五维均值,"画面质量"连续下滑,先查角色卡版本与风格模板变更记录(第 9.2 节),再查模型服务波动——分数异常永远对应一次变更,台账的意义就是让变更可追溯。
门禁失败的处理流固定三步:定位阶段(哪个门禁项红的)、最小重跑(按第 8.3 节粒度只重做受影响的镜头或环节)、复检(原门禁项重跑加相邻一项)。禁止"一把梭重跑整条"——那等于宣告台账与断点续跑白建了。
质量与成本的建制齐了,成片终于可以出门。最后一章讲发布:AI 生成内容的标识义务怎样履行、多平台交付变体怎样组织,以及整条管线怎样打包交付给下一个人。