HLS Interstitials 新特性
What's new in HLS Interstitials
2022年6月6日
一句话判断
如果你的应用涉及视频广告插入,这场 Session 值得细看——新增的 PRE/POST/ONCE 广告排期、SNAP 属性解决直播时钟漂移、以及 HLS_start_offset 让服务端精准投放剩余广告位。
这场 Session 讲了什么
Prashant 介绍了 HLS Interstitials 在 2022 年的新增特性。HLS Interstitials 是 2021 年推出的 HLS 广告插入机制,将广告视为独立资产通过 multivariant playlist 引用,而非传统的方式拼接在主内容流中。今年的更新主要围绕三个方面:广告排期选项(CUE 属性)、直播场景下的精确对齐(SNAP 属性)、以及服务端广告优化的查询参数。
值得深挖的点
三种新的 CUE 选项。PRE 让广告在主内容开始前播放——适合直播场景下的高端广告位。POST 让广告在主内容结束后播放——适合直播赛事的片尾字幕。ONCE 让广告只播放一次——适合分级画面提示,用户拖动进度条回退也不会重复看到。
SNAP 属性解决直播中的时钟漂移。在直播场景中,打包器(packager)和编码器(encoder)可能使用不同的时钟,导致 DATERANGE 标记的时间与实际媒体时间存在偏差。SNAP=OUT 在最接近预期广告开始时间的段边界切出主内容,SNAP=IN 在最接近广告返回时间的段边界切回主内容。这个属性仅适用于直播场景。
HLS_start_offset 优化广告库存。当用户在直播中途加入时,可能已经错过了部分广告时间。HLS_start_offset 查询参数告诉服务端广告已经播放了多少秒,服务端据此在剩余时间内投放最有价值的广告。这是一个非常实用的广告收入优化工具。
HLS_primary_id 关联播放会话。用于将广告请求与主播放会话关联起来,避免对同一用户重复投放相同广告。客户端通过 HTTP 请求头传递会话 ID,服务端在广告请求中收到 HLS_primary_id 参数。
AVPlayerInterstitialEvent 变为可变对象。由于属性越来越多,Apple 将 AVPlayerInterstitialEvent 改为 mutable,允许先创建再配置属性,降低了使用复杂度。
代码片段
// 创建可变的广告事件
let event = AVPlayerInterstitialEvent(
primaryItem: primaryPlayerItem,
identifier: "ad-001",
time: CMTime(seconds: 5, preferredTimescale: 600),
templateItems: [adPlayerItem]
)
// 配置 CUE 选项
event.cue = [.pre] // 前贴片广告
event.willPlayOnce = true // 只播放一次
// 配置 SNAP 选项(直播场景)
event.alignsStartWithPrimarySegmentBoundary = true // SNAP=OUT
event.alignsResumptionWithPrimarySegmentBoundary = true // SNAP=IN
// HLS 播放列表中的 DATERANGE 标签示例
// #EXT-X-DATERANGE:ID="ad-001",START-DATE="...",CUE="PRE,ONCE",
// X-ASSET-LIST="https://ad.server/asset-list?HLS_start_offset=10&HLS_primary_id=session-123"
最佳实践
- SNAP 属性仅用于直播场景,VOD 内容不存在时钟漂移问题
- 直播中途加入时利用 HLS_start_offset 让服务端动态调整广告列表
- 使用 HLS_primary_id 跟踪会话,避免重复广告
- 替换已拼接的广告时,用 resume offset 等于被替换广告的时长
- 客户端应设置 playback session ID 请求头,确保会话关联准确
还有什么值得关注
- HLS Interstitials 的基础用法参考 WWDC 2021 的 “Dynamically insert midrolls and prerolls in HLS”
- AVPlayerInterstitialEvent 的可变设计意味着未来可能继续添加新属性
- PRE/POST 广告排期对直播赛事和节目播控场景尤其有价值
- ONCE 选项可以用于分级提示、版权声明等只需展示一次的内容