Highlight
Apple 在 iOS 17 推出了 AirPlay 增强音频缓冲(Enhanced Audio Buffering)协议,通过 AVQueuePlayer 或 AVSampleBufferAudioRenderer 即可让应用获得更快的音频流缓冲、更灵敏的控制响应、多声道格式支持以及智能无损播放能力。
核心内容
为什么需要增强音频缓冲
用 AirPlay 听歌时,用户最烦的两件事:手机一走出 Wi-Fi 范围音乐就断,以及点了暂停却要等半天才有反应。
(02:17)Apple 今年推出了全新的 AirPlay 增强音频缓冲协议,从底层重新设计。它的核心改进有三点:音频流以快于实时播放的速度缓冲,减少中断;控制指令(播放、暂停、切歌)即时响应;支持杜比全景声等多声道格式,iOS 上还新增了无损播放的智能切换。
Session 中演示了一个典型场景:用户拿着手机出门倒垃圾,走出 Wi-Fi 范围后 HomePod 继续播放;用户回到 Wi-Fi 范围,手机无缝恢复控制,音乐全程没有中断。
集成方式:两条路径
(06:11)Apple 提供了两套 API 来支持增强音频缓冲。大多数开发者应该直接用 AVQueuePlayer,它会自动处理增强音频缓冲。只有需要自定义 DRM 或音频预处理的应用,才需要用底层的 AVSampleBufferAudioRenderer + AVSampleBufferRenderSynchronizer。
详细内容
配置 Audio Session
(04:00)在集成 AirPlay 之前,先确保音频会话配置正确:
let audioSession = AVAudioSession.sharedInstance()
try audioSession.setCategory(.playback, mode: .default, policy: .longFormAudio)
关键点:
.playback类别确保应用进入后台后音频继续播放.longFormAudio策略告诉系统这是音乐、播客等长音频内容,不是系统音效- 播客或有声书建议将 mode 设为
.spokenAudio
智能 AirPlay 建议
(04:43)iOS 17 新增了基于设备端智能的 AirPlay 建议。系统会学习用户的使用习惯——比如用户通常在做饭时用厨房的 HomePod 听歌——当用户打开你的应用时,附近的 HomePod 会自动显示为推荐目标。
开启方式很简单,在 Info.plist 中添加:
<key>AVInitialRouteSharingPolicy</key>
<string>LongFormAudio</string>
在 Xcode 中,这个 key 显示为 “AirPlay optimization policy”。
AVQueuePlayer 方式(推荐)
(07:23)AVQueuePlayer 是最简单的集成方式,自动获得增强音频缓冲:
let player = AVQueuePlayer()
let url = URL(string: "https://example.com/audio.m3u8")
let asset = AVAsset(url: url)
let item = AVPlayerItem(asset: asset)
player.insert(item, after: nil)
player.play()
关键点:
- 创建
AVQueuePlayer实例 - 用
AVAsset和AVPlayerItem包装内容 URL insert(item, after: nil)将项目加入队列- 当路由到 AirPlay 时,增强音频缓冲自动生效
- 大多数 Apple 自家的媒体应用也使用 AVQueuePlayer
自定义播放器方式
(08:28)如果 AVQueuePlayer 无法满足需求(如自定义 DRM 或音频预处理),使用 AVSampleBufferAudioRenderer:
let serializationQueue = DispatchQueue(label: "sample.buffer.player.serialization.queue")
let audioRenderer = AVSampleBufferAudioRenderer()
let renderSynchronizer = AVSampleBufferRenderSynchronizer()
renderSynchronizer.addRenderer(audioRenderer)
(08:50)入队音频数据:
serializationQueue.async { [weak self] in
guard let self = self else { return }
self.audioRenderer.requestMediaDataWhenReady(on: serializationQueue) { [weak self] in
guard let self = self else { return }
while self.audioRenderer.isReadyForMoreMediaData {
let sampleBuffer = self.nextSampleBuffer()
if let sampleBuffer = sampleBuffer {
self.audioRenderer.enqueue(sampleBuffer)
} else {
self.audioRenderer.stopRequestingMediaData()
}
}
}
self.renderSynchronizer.rate = 1.0
}
关键点:
serializationQueue是串行队列,所有播放操作都在这个队列上执行AVSampleBufferRenderSynchronizer建立统一的时间轴addRenderer将音频渲染器绑定到同步器requestMediaDataWhenReady在渲染器准备好接收数据时回调isReadyForMoreMediaData检查是否可以继续入队- 数据耗尽时调用
stopRequestingMediaData() rate = 1.0开始以自然速率播放
CarPlay 支持
(09:26)汽车制造商现在也能在 CarPlay 实现中支持增强缓冲。由于越来越多的车辆支持无线 CarPlay,稳定的播放和灵敏的控制对车载音频体验至关重要。好消息是,应用只要采用了上述两套 API 之一,CarPlay 会自动受益。
核心启发
-
做播客应用时开启智能 AirPlay 建议
- 做什么:让用户打开应用时,常用的音箱自动出现在 AirPlay 目标列表顶部
- 为什么值得做:只需在 Info.plist 加一个 key,零代码成本提升用户体验
- 怎么开始:添加
AVInitialRouteSharingPolicy为LongFormAudio,同时确保音频会话类别设置为.playback
-
做多房间音乐同步播放
- 做什么:让用户同时投放到多个 HomePod 或 AirPlay 音箱,实现全屋同步播放
- 为什么值得做:增强音频缓冲协议专为全屋音频设计,缓冲速度更快、同步更精准
- 怎么开始:用 AVQueuePlayer 播放,系统会自动处理多设备同步,应用层无需额外逻辑
-
做支持后台持续播放的音频应用
- 做什么:用户走出 Wi-Fi 范围时,音箱继续播放;用户回来后无缝恢复控制
- 为什么值得做:这是增强音频缓冲的核心能力,以前需要复杂的重连逻辑,现在协议层自动处理
- 怎么开始:确保使用 AVQueuePlayer,配置正确的音频会话类别,其他交给系统
-
做带自定义音频处理的播放器
- 做什么:在音频播放前进行自定义处理(如实时音效、可视化分析),同时支持 AirPlay
- 为什么值得做:AVSampleBufferAudioRenderer 让你可以在入队前处理音频数据,同时享受增强缓冲的好处
- 怎么开始:用
AVSampleBufferAudioRenderer+AVSampleBufferRenderSynchronizer构建自定义播放器,在nextSampleBuffer()中插入处理逻辑
关联 Session
- Explore AirPlay with interstitials — 了解如何在 AirPlay 中使用 HLS Interstitials 实现广告插入
- Add SharePlay to your app — 将 SharePlay 添加到应用中,与 AirPlay 配合实现共享体验
- Discover Continuity Camera for tvOS — tvOS 上的 Continuity Camera 与 AirPlay 生态
评论
GitHub Issues · utterances