在 SharePlay 中展示广告和插播内容
Display ads and interstitials in SharePlay
2022年6月6日
一句话判断
如果你的 SharePlay 应用涉及广告插入,这场 Session 解决了一个核心难题——如何让不同用户看到不同广告后还能保持同步播放。
这场 Session 讲了什么
AVFoundation 工程师 Prashant 详细讲解了在 SharePlay(FaceTime 同步观看)场景下处理广告和插播内容的技术方案。核心问题是:当不同参与者看到不同时长、甚至不同数量的广告时,如何让他们在广告结束后重新同步到主内容。
Session 覆盖了两种广告调度方案:传统的缝合式广告(直接拼接在 HLS 播放列表中)和 WWDC 2021 引入的 HLS Interstitials(独立于主内容时间线的插播方案)。对于每种方案,都讲解了如何在 AVPlaybackCoordinator 上配置等待策略。
内容还包括”等待策略”的设计哲学——是让看完广告的用户等待其他人,还是让他们继续看主内容让其他人追上来。这是一个产品决策,AVFoundation 提供了相应的 API 来实现。
值得深挖的点
两种等待策略的权衡。 当 Alice 和 Bob 的广告时长不同时,有两种处理方式:第一种是”等一等”——Alice 看完广告后暂停,等 Bob 也看完再一起继续,这种方式保证所有人看到完整内容但不流畅;第二种是”追上来”——Alice 继续看主内容,Bob 看完广告后跳到 Alice 当前进度,这种方式更流畅但 Bob 会错过部分内容。默认行为是后者。
缝合式广告的时间范围上报。 对于 VOD 内容中通过 EXTINF 标签拼接的广告段,你需要通过 AVPlayerPlaybackCoordinator 的代理方法精确上报广告时间范围。系统会根据这些信息协调播放——当参与者进入广告时间范围时,播放协调会遵循你设定的等待策略。
HLS Interstitials 的自动化程度更高。 使用 HLS Interstitials 调度广告时,AVFoundation 会自动处理协调播放逻辑,你只需要指定等待策略。广告作为独立对象存在于主内容时间线之外,支持服务端插入(通过 date-range 标签引用)和客户端调度(通过 AVFoundation API)。
SharePlay 兼容性要求。 对于 VOD 内容,要求所有参与者的主内容时长一致(广告时长可以不同)。对于直播内容,如果使用缝合式广告,则要求所有参与者的广告段时长一致。
代码片段
// 配置等待策略:让组内其他参与者等待广告结束
playbackCoordinator.suspensionReasonsThatTriggerWaiting = [.playingInterstitial]
// 默认行为:不等待,广告结束后跳到当前进度追上来
// playbackCoordinator.suspensionReasonsThatTriggerWaiting = []
// 通过代理方法上报缝合式广告的时间范围
func playbackCoordinator(_ coordinator: AVPlayerPlaybackCoordinator,
identifierFor playerItem: AVPlayerItem) -> String {
return playerItem.identifier
}
// 上报广告时间范围(适用于缝合式广告)
// 需要精确计算 EXTINF 标签中的时间段落
let adTimeRanges: [CMTimeRange] = [
CMTimeRange(start: .init(seconds: 30, preferredTimescale: 600),
duration: .init(seconds: 15, preferredTimescale: 600))
]
最佳实践
- 优先使用 HLS Interstitials 调度广告,AVFoundation 会自动处理协调播放
- 根据你的产品定位选择等待策略:内容完整性优先选”等待”,流畅度优先选”追赶”
- 对于 VOD 缝合式广告,确保 EXTINF 标签中的时长准确反映实际媒体时长
- 参与者在等待其他人完成广告时,
timeControlStatus会变为waitingToPlayAtSpecifiedRate,等待原因为waitingForCoordinatedPlayback - 如果允许用户在 SharePlay 期间拖动到广告时间范围,整个组会跳到该时间范围的起始位置
还有什么值得关注
- 直播内容的缝合式广告要求所有参与者的广告段时长一致,这限制了个性化广告的空间
- HLS Interstitials 对主内容时长的要求意味着即使广告完全不同,底层资产结构需要保持一致
- 如果你的服务有区域性法规要求(如某些地区必须播放法定警告),这些内容也需要纳入协调播放的考量
- 可以结合 WWDC 2021 的 “Explore dynamic pre-rolls and mid-rolls in HLS” 了解 HLS Interstitials 的基础概念