05-delivery-and-qa
视频交付与 QA
slide-video-delivery 是最终交付阶段。它被设计为不可拆分的阶段:只有视频、字幕、横屏封面、竖屏封面和 QA 全部完成,才算交付成功。
输入
交付阶段需要四类输入:
deck-manifest.json:描述 HTML 入口、画布和页面 ID。deck.html:实现window.__SLIDE_VIDEO__的 HTML 幻灯片。tts-manifest.json:记录真实音频时间线。voiceover.wav:TTS 生成的完整音频。
执行前会校验 schema version、画布尺寸和 slide_id 集合。这里禁止按页面数量猜测映射。
逐页渲染
render_slides.js 使用 Playwright 打开 deck.html,按 deck-manifest.json 中的顺序逐页调用:
await window.__SLIDE_VIDEO__.showSlide(slideId);
await window.__SLIDE_VIDEO__.ready(slideId);
然后等待 settle_ms,截图到 frames/。默认画布来自 manifest 的 canvas,通常是 1920×1080。
这个阶段的目标是把动态 HTML 固化成稳定帧序列。
视频合成
make_video.py 读取 tts-manifest.json,按每页所有片段的 audio_duration + break_after 计算页面持续时间,然后把帧序列和 voiceover.wav 合成为 final.mp4。
关键点是视频时长跟随真实 TTS manifest,而不是用估算字数或固定页时长。
字幕生成与烧录
make_ass_subtitles.py 从 tts-manifest.json 直接生成 subtitles.ass。
字幕时间轴使用片段的 start、audio_duration 和 end。这样字幕、音频和画面都来源于同一条实际时间线。
burn_subtitles.py 再把字幕烧录进视频,生成 final-subtitled.mp4。
双封面
交付阶段固定生成两张封面:
- 横屏
cover.png:16:9,用于常规视频平台横图展示。 - 竖屏
cover-portrait.png:9:16,用于竖版信息流或移动端缩略图。
两张封面不是机械裁切关系。它们需要保持相同主题、标题和核心视觉语言,但分别按横向和竖向构图设计。
竖屏封面尤其要检查:
- 四周安全边距。
- 关键内容位于中央 3:4 安全区域内。
- 标题、副标题和系列编号不贴边。
- 缩略图状态仍可读。
机器 QA
qa_video.py 检查最终视频的基本媒体条件:
- 同时包含视频流和音频流。
- 分辨率匹配预期宽高。
- 实际时长与
tts-manifest.json的音频总时长误差不超过0.1s。 - 每个正文片段都能按时间点抽取 QA 帧。
QA 帧抽取时间点是片段中点:
timestamp = start + audio_duration / 2
这样每个片段都能对应一张代表帧,用于检查是否错页、黑屏、裁切、重叠、溢出或渲染缺失。
人工视觉 QA
机器只能判断视频是否存在、时长是否对齐、帧能否抽出,不能判断画面内容是否正确。因此交付阶段必须逐张查看 qa-frames/,并把状态写回 delivery-report.json。
需要检查:
- 页面是否和口播片段匹配。
- 是否黑屏或空白。
- 是否有裁切。
- 文本是否重叠或溢出。
- 图像、字体和视觉元素是否缺失。
- 字幕是否可读且没有遮挡关键信息。
- 横竖封面尺寸、标题和缩略图可读性是否通过。
只有所有视觉状态都为 passed,才算完成交付。
Comments
Post a Comment