WWDC Quick Look 💓 By SwiftGGTeam
Tune up your AirPlay audio experience

Tune up your AirPlay audio experience

观看原视频

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 实例
  • AVAssetAVPlayerItem 包装内容 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 会自动受益。

核心启发

  1. 做播客应用时开启智能 AirPlay 建议

    • 做什么:让用户打开应用时,常用的音箱自动出现在 AirPlay 目标列表顶部
    • 为什么值得做:只需在 Info.plist 加一个 key,零代码成本提升用户体验
    • 怎么开始:添加 AVInitialRouteSharingPolicyLongFormAudio,同时确保音频会话类别设置为 .playback
  2. 做多房间音乐同步播放

    • 做什么:让用户同时投放到多个 HomePod 或 AirPlay 音箱,实现全屋同步播放
    • 为什么值得做:增强音频缓冲协议专为全屋音频设计,缓冲速度更快、同步更精准
    • 怎么开始:用 AVQueuePlayer 播放,系统会自动处理多设备同步,应用层无需额外逻辑
  3. 做支持后台持续播放的音频应用

    • 做什么:用户走出 Wi-Fi 范围时,音箱继续播放;用户回来后无缝恢复控制
    • 为什么值得做:这是增强音频缓冲的核心能力,以前需要复杂的重连逻辑,现在协议层自动处理
    • 怎么开始:确保使用 AVQueuePlayer,配置正确的音频会话类别,其他交给系统
  4. 做带自定义音频处理的播放器

    • 做什么:在音频播放前进行自定义处理(如实时音效、可视化分析),同时支持 AirPlay
    • 为什么值得做:AVSampleBufferAudioRenderer 让你可以在入队前处理音频数据,同时享受增强缓冲的好处
    • 怎么开始:用 AVSampleBufferAudioRenderer + AVSampleBufferRenderSynchronizer 构建自定义播放器,在 nextSampleBuffer() 中插入处理逻辑

关联 Session

评论

GitHub Issues · utterances