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

Popular posts from this blog

How to turn off Sass warning prompts in Nuxt.js projects

Configuring SSH Access to a Docker Container via an Alternative Port

Quickly Set Up a Cloud Database Using MongoDB Atlas