深入 AirPlay 与 HLS 插播广告
Explore AirPlay with interstitials
2023年6月5日
一句话判断
如果你在做视频流媒体应用并使用 HLS Interstitials 做广告插播,这场 Session 讲清楚了 AirPlay 场景下广告的播放控制、导航限制如何自动转发到接收端——无需额外代码改动。
这场 Session 讲了什么
Session 的核心议题是 HLS Interstitials 在 AirPlay 场景下的行为。HLS Interstitials 把广告作为独立资产定义在主视频的时间线上,播放器到达标记点时自动切换到广告播放。插播内容可以动态调度或取消,支持延迟绑定(临近标记点才决定播放哪条广告)和重新绑定(用户回看时不重复播放相同广告)。
AirPlay 有三种使用模式:音频流(多 HomePod 同步播放)、屏幕镜像(共享 iOS/macOS 屏幕)、视频流(将视频无线发送到 Apple TV 或支持 AirPlay 的电视,支持 4K HDR)。HLS Interstitials 对 AirPlay 和画中画(PiP)有内建支持,调度的广告和插播内容会自动传递到 AirPlay 会话中。
插播广告的调度方式分服务端驱动和客户端驱动两种。服务端通过在 HLS 播放列表的 EXT-X-DATERANGE 标签中设置属性来调度;客户端通过 AVFoundation 的 AVPlayerInterstitialEvent 和 AVPlayerInterstitialEventController 来编程调度。
导航限制是 Session 的重点。两种限制类型:Skip(禁止快进/慢放广告)和 Jump(禁止跳出当前广告)。限制可以在服务端通过 X-RESTRICT 属性设置,也可以在客户端通过 AVPlayerInterstitialEvent 的 restrictions 属性设置。关键信息是:这些限制会自动传递到 AirPlay 接收端执行,不需要额外的代码改动。
值得深挖的点
AirPlay 接收端执行限制的机制:非苹果的 AirPlay 接收端不运行 AVFoundation 代码,但导航限制仍然能被正确执行。这说明苹果在 AirPlay 协议层面传递了限制信息,而非依赖客户端代码。这给流媒体服务提供商省去了大量兼容性工作。
VOD vs Live 的恢复行为差异:VOD 内容播放广告后,主内容从暂停点继续;Live 内容播放广告后,主内容会跳到当前时间点(跳过广告播放期间的时间)。恢复偏移量可以通过服务端 X-RESUME-OFFSET 或客户端 resumptionOffset 属性控制。
多广告连续播放:Session 展示了背靠背广告(ad1 + ad2)的播放流程。在播放列表中设置相同的开始日期,广告会按出现顺序依次播放。
代码片段
客户端方式创建插播广告事件:
import AVFoundation
// 创建插播广告事件
let adURL = URL(string: "https://example.com/ad1.m3u8")!
let primaryItem = AVPlayerItem(url: URL(string: "https://example.com/movie.m3u8")!)
let adEvent = AVPlayerInterstitialEvent(
primaryItem: primaryItem,
identifier: "ad1",
time: CMTime(seconds: 5.0, preferredTimescale: 600), // 5秒处插入广告
templateItems: [AVPlayerItem(url: adURL)],
restrictions: [.skip], // 禁止快进广告
resumptionOffset: CMTime(seconds: 0, preferredTimescale: 600) // 恢复偏移
)
// 设置事件控制器
let eventController = AVPlayerInterstitialEventController(primaryPlayer: player)
eventController.events = [adEvent]
服务端 HLS 播放列表中设置广告限制:
#EXT-X-DATERANGE:ID="ad1",START-DATE="2023-06-05T12:00:05Z",
DURATION=10,X-RESTRICT="skip",X-RESUME-OFFSET=10
#EXT-X-DATERANGE:ID="ad2",START-DATE="2023-06-05T12:00:05Z",
DURATION=10
最佳实践
- 导航限制优先使用服务端方式配置,这样 AirPlay 接收端无需任何客户端代码即可执行
- 将广告功能和追踪功能使用不同子域名,避免 AirPlay 连接被意外阻断
- 测试时在真实 AirPlay 接收端(Apple TV 或第三方电视)上验证限制行为
- 广告插播的本地化内容需要提前准备好不同语言版本
- 回看场景下利用重新绑定机制避免重复播放相同广告
还有什么值得关注
- AirPlay 接收端的广告播放延迟和缓冲策略
- 画中画(PiP)场景下插播广告的用户体验设计
- 第三方 AirPlay 接收端对导航限制的支持程度
- 插播广告在直播场景中的调度精度