WWDC Quick Look 💓 By SwiftGGTeam
Adapt ad insertion to Low-Latency HLS

Adapt ad insertion to Low-Latency HLS

观看原视频

Highlight

Low-Latency HLS 的服务器侧广告插入要把广告也按 Partial Segment 发布,并为广告和节目内容同时提供 Blocking Playlist Reload 与 preload hints,才能在广告切换时维持低延迟播放模型。

核心内容

普通直播 HLS 的广告插入靠 segment 边界工作。节目源带着可插入广告的 marker,packager 在广告开始前补一个短节目 segment,把边界对齐到 segment,再用 discontinuity tag 切到广告。广告结束后,它再补一个短广告 segment,然后切回节目。

低延迟直播把这个模型变细了。客户端不再等完整 segment 出现,而是贴着 live edge 读取更短的 Partial Segment。一个 6 秒 parent segment 可以拆成多个 2 秒 partial,客户端两秒后就能拿到第一段媒体,不必等完整 6 秒。

广告插入因此不能只发布完整广告 segment。广告开始后,packager 也要每隔一个 partial duration 发布广告 Partial Segment。parent segment 仍然存在,discontinuity、边界对齐、key rotation 的位置也不变。变化在 live edge:播放器看到的是更频繁出现的广告 partial。

还有一个直播里常见的麻烦:early return。赛事直播中,制作方可能在广告尚未播完时切回现场。此时服务器要停止广告 partial,补出一个到当前点为止的短 parent segment,更新 preload hint,让客户端转向下一段节目 partial。

详细内容

Partial Segment 改变广告插入的节奏

01:51)Low-Latency HLS 在 live edge 使用 Partial Segment。演讲用 6 秒 segment 与 2 秒 partial 举例:客户端两秒后可以拿到 segment 的第一部分,四秒后拿到更多内容,六秒后拿到最后一个 partial 和 parent segment。

这个节奏直接影响广告。packager 不能等完整广告 segment 都准备好才更新 playlist。它要在 parent segment 生成过程中持续发布广告 partial,让客户端在广告段落也能按照同一套 live edge 规则播放。

关键点:

  • parent segment 是完整的常规 HLS segment。
  • Partial Segment 承载同一段媒体,但更早出现在 playlist。
  • 客户端用 Partial Segment 贴近 live edge 播放,避免等待完整 segment 的发布延迟。
  • 广告内容也要先按 partial duration 发布,parent segment 随后出现,否则切到广告时会退回普通 HLS 的延迟模型。

广告边界仍然靠短 segment 和 discontinuity 对齐

02:54)普通 HLS 的服务器侧广告插入先处理边界。marker 不一定落在常规 segment 边界上,packager 可能要生成一个短节目 segment,让广告开始点刚好落在 segment 边界。切换广告时,用 discontinuity tag 分隔节目和广告。

典型顺序是:节目源给出可插入广告的 marker,decisioning engine 选择广告,packager 用短节目 segment 对齐广告开始点,然后用 ad segment 替换后续节目 segment。广告结束点也可能不在常规 segment 边界上,所以 packager 还要生成短广告 segment,再回到节目内容。

关键点:

  • marker 来自节目源,表示哪里可以插入广告。
  • 短节目 segment 让广告开始点变成明确边界。
  • discontinuity tag 标记节目内容与广告内容的切换。
  • 广告结束点也可能不在 segment 边界上,所以需要短广告 segment。

广告也要先以 Partial Segment 发布

04:20)低延迟场景继续使用同一套广告边界,但发布顺序更细。广告开始后,packager 先按 partial duration 发布广告 partial;当一个 parent segment 的所有 partial 都到齐,再发布完整广告 parent segment。

演讲里的时间线是:节目 partial 正常推进,广告边界前出现一个短节目 partial 与 parent segment。进入广告后,packager 每两个秒级 partial duration 增加一个广告 partial。凑齐一个完整广告 segment 后,parent segment 跟着出现。广告结束时,再用短广告 partial 对齐边界,然后恢复节目 partial 和 parent segment。

关键点:

  • ad boundary、discontinuity 和 key rotation 的位置保持在同一条时间线上。
  • 低延迟差异发生在发布粒度:广告 segment 先拆成 Partial Segment 出现在 live edge。
  • packager 必须为节目和广告都维持同一个 low-latency timing model。
  • 如果广告只按完整 segment 发布,播放器会在广告段落失去低延迟优势。

Blocking Playlist Reload 也覆盖广告段落

05:48)演讲明确要求 origin 对广告也实现 Blocking Playlist Reload。客户端请求下一个 playlist 版本时,服务器不要立即返回旧 playlist,而是等到新的 partial 或 segment 可用后返回。

这个要求不只适用于节目内容。广告 partial 进入 playlist 前,origin 也要维持同样的等待语义。这样客户端拿到的 playlist 才会继续贴近 live edge,而不是在广告段落反复收到过时版本。

关键点:

  • Blocking Playlist Reload 是 HLS Origin API 的组成部分。
  • 它保护的是 playlist 更新时机,不只适用于节目内容。
  • 广告段落若立即返回旧 playlist,客户端会拿到 stale playlist,低延迟播放会被拖慢。
  • 广告和节目共用同一套等待与发布节奏,播放器才不用在切换处改策略。

Preload hints 要提示广告 MAP 和广告 partial

06:08)Preload hinting 要求 playlist 写出下一个预计出现的资源 URL。广告切换时,playlist 可以先提示新的 media initialization section,再提示广告的第一个 Partial Segment。

演讲示例里,segment 7 是当时最后可用的节目内容。playlist 末尾先给出两个 preload hints:一个提示客户端加载广告需要的新 media initialization section,一个提示广告的第一个 partial。两秒后,playlist 更新出 discontinuity、广告 map tag 和广告第一个 part tag,新的 preload hint 再指向广告第二个 partial。

关键点:

  • TYPE=MAP 提示即将用于广告内容的新初始化信息。
  • TYPE=PART 提示下一个广告 Partial Segment。
  • 广告是预录内容,ad origin 不需要像实时节目源那样等待编码完成。
  • playlist 仍然要持续更新 hint,让客户端一直知道下一个要请求的广告资源。

Early return 时更新 hint,直接切回节目

07:55)early return 指直播制作方提前结束广告,立刻切回节目。服务器可以停止发布后续广告 partial,补出一个到当前已发布 partial 为止的短 parent segment,随后用 discontinuity 切回节目。

关键处理点是 hint。服务器之前可能已经提示了下一段广告 partial。等它知道要提前回到节目后,就要把 hint 改到下一个节目 partial。客户端看到新的 hint 后,会切回节目内容的加载路径。

关键点:

  • 已经发出的旧 hint 可能指向下一段广告 partial。
  • 服务器知道要提前返回节目后,把 hint 改成下一段节目 partial。
  • 客户端看到新的 hint,就停止沿着广告库存继续加载。
  • 这个处理让突发直播内容可以立刻回到节目,同时保留低延迟加载路径。

核心启发

  • 做什么:给低延迟直播 packager 增加广告 partial 发布链路。 为什么值得做:演讲明确指出广告在 LL-HLS 中要先以 Partial Segment 出现在 live edge。 怎么开始:复用节目内容的 partial duration,把广告素材切成同样节奏的 partial,并在完整 parent segment 可用时一并发布。

  • 做什么:把广告切换点做成可观测的 playlist 校验项。 为什么值得做:广告开始和结束都依赖短 segment、discontinuity 与边界对齐。 怎么开始:在自动化检查里扫描广告 marker 附近的 playlist,确认短 segment、discontinuity tag、广告 map tag 和广告 partial 的顺序正确。

  • 做什么:为 SSAI(Server-Side Ad Insertion,服务器侧广告插入)实现 hint 重写能力。 为什么值得做:early return 会让已经发布的广告 hint 失效,服务器必须把它改向节目 partial。 怎么开始:在决策引擎发出提前返回信号时,让 packager 生成短广告 parent segment,并把下一条 preload hint 改成节目 URI。

  • 做什么:把广告 origin 和节目 origin 的阻塞语义分开配置。 为什么值得做:演讲指出广告为预录内容,ad origin 不需要强制阻塞等待;playlist origin 仍要为广告和节目执行 Blocking Playlist Reload。 怎么开始:把 playlist 生成服务作为低延迟控制点,让它负责 blocking reload 和 hint;广告媒体文件可以由普通静态 origin 或 CDN 提供。

  • 做什么:在播放器测试中加入广告段落的 live-edge 延迟曲线。 为什么值得做:广告如果退回完整 segment 发布,用户会在广告处看到延迟跳变。 怎么开始:记录节目 partial、广告 partial、parent segment 和 playlist 返回时间,分别计算广告前、广告中、广告后的 live-edge 距离。

关联 Session

评论

GitHub Issues · utterances