Display ads and interstitials in SharePlay
System & Services 进阶 20m

在 SharePlay 中展示广告和插播内容

Display ads and interstitials in SharePlay

2022年6月6日

在 Apple 官方观看视频

一句话判断

如果你的 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 的基础概念
WWDC 2022