Tune up your AirPlay audio experience
Media & Web 进阶 20m

优化你的 AirPlay 音频体验

Tune up your AirPlay audio experience

2023年6月5日

在 Apple 官方观看视频

一句话判断

如果你的应用播放音乐或播客,AirPlay 增强音频缓冲能让你在 Wi-Fi 断连时依然保持播放不中断——而集成它的方式可能比你想象的简单得多。

这场 Session 讲了什么

AirPlay 团队的 Kelly 介绍了 AirPlay 增强音频缓冲(Enhanced Audio Buffering)协议及其集成方式。

AirPlay 支持三种使用场景:音频流(投到 HomePod 或第三方音箱)、视频流(投到 Apple TV 或智能电视,支持 4K HDR)和屏幕镜像。本次 Session 聚焦音频流部分。

增强音频缓冲是全新一代的 AirPlay 协议,专为全屋音频场景设计。它的核心特性包括:以高于实时播放速度缓冲音频流来减少中断、对控制指令的即时响应、支持杜比全景声等多声道格式、iOS 上的无损播放支持,以及对 HLS Interstitials(广告插入)的完善支持。

Session 现场演示了一个关键场景:当手机走出 Wi-Fi 覆盖范围时,HomePod 依然持续播放;手机重新连接网络后无缝恢复控制——这正是增强音频缓冲的实战表现。

集成方式分两条路径:推荐大多数开发者使用 AVQueuePlayer,自动获得增强音频缓冲支持;有特殊需求(如自定义 DRM 或音频预处理)的开发者可以使用 AVSampleBufferAudioRenderer + AVSampleBufferRenderSynchronizer。

值得深挖的点

高于实时速度的缓冲策略:增强音频缓冲会以比实时播放更快的速度传输音频数据。这意味着即使网络出现短暂波动,播放器本地已有足够的缓冲数据来平稳度过。对于全屋音频场景,这个设计从根本上解决了 Wi-Fi 信号不稳定导致的卡顿问题。

智能 AirPlay 建议:iOS 现在会用设备端机器学习来学习用户的 AirPlay 使用习惯。如果你总是在做饭时把音乐投到厨房的 HomePod,下次打开音乐应用时那个 HomePod 就会自动出现在候选列表中。集成这个功能只需要在 Info.plist 中设置一个 key。

长音频 vs 系统音效的路由策略:AVAudioSession 的 routing policy 需要设置为 longFormAudio。长音频是指音乐、播客等持续播放的内容,区别于系统音效。这个设置影响系统如何处理音频路由和中断行为。

两种 API 路径的选择:AVQueuePlayer 适合绝大多数场景,Apple 自己的媒体应用也在用。AVSampleBufferAudioRenderer 则适合需要自己控制音频数据流的场景——比如你有自己的 DRM 方案,或者需要在发送前对音频做预处理。

代码片段

// 基础 AirPlay 配置 - 四步走
// 1. 配置 Audio Session
let session = AVAudioSession.sharedInstance()
try session.setCategory(.playback)           // 确保后台也能播放
try session.setMode(.default)                // 播客/有声书用 .spokenAudio
try session.setRoutingPolicy(.longFormAudio) // 声明为长音频内容
try session.setActive(true)

// 2. Info.plist 中设置智能 AirPlay 建议
// Key: AVInitialRouteSharingPolicy
// Value: LongFormAudio
// 在 Xcode 中对应 "AirPlay optimization policy"

// 3. 添加 AirPlay 路由选择器到 UI
let routePicker = AVRoutePickerView()
routePicker.tintColor = .systemBlue
view.addSubview(routePicker)

// 4. 配置远程控制
MPNowPlayingInfoCenter.default().nowPlayingInfo = [
    MPMediaItemPropertyTitle: "当前播放标题",
    MPMediaItemPropertyArtist: "艺术家"
]
// 方案一: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()
// 就这么简单 - 当路由到 AirPlay 时自动启用增强音频缓冲

// 方案二:AVSampleBufferAudioRenderer(适合自定义音频处理)
let renderer = AVSampleBufferAudioRenderer()
let synchronizer = AVSampleBufferRenderSynchronizer()
synchronizer.addRenderer(renderer)

// 通过回调提供音频数据
renderer.requestMediaDataWhenReady(
    on: serialQueue,
    using: { [weak self] in
        guard let self, renderer.status == .rendering else { return }
        while renderer.isReadyForMoreMediaData {
            // 将处理后的 CMSampleBuffer 送入渲染器
            guard let sampleBuffer = self.nextAudioSample() else {
                renderer.stopRequestingMediaData()
                return
            }
            renderer.enqueue(sampleBuffer)
        }
    }
)

最佳实践

  • 优先选择 AVQueuePlayer:除非你有明确的理由需要自己处理音频数据,否则 AVQueuePlayer 是最省心的方案。它自动处理播放列表管理、控制、seek 和增强音频缓冲。
  • 设置正确的 Audio Session Category:播放类应用必须用 .playback,否则进入后台后音频会停止。
  • 利用智能 AirPlay 建议:只需一个 Info.plist 配置就能让系统学习用户的投屏习惯,这是提升用户体验的免费午餐。
  • 监听路由变化:如果你需要区分 AirPlay 和本地/蓝牙播放(比如使用不同的 API),注册 AVAudioSession 的 routeChangeNotification 来动态切换。
  • 播客和有声书设置 spokenAudio 模式:这个模式会调整系统的音频处理行为,更适合语音内容。

还有什么值得关注

  • 增强音频缓冲对 HLS Interstitials 的支持意味着广告插入场景下 AirPlay 也能正常工作,这对播客和免费音乐流媒体应用很重要。
  • 无损播放支持是今年新增的,配合 AirPlay 可以在兼容的音箱上享受更高音质。
  • Session 提到”数百 millions”的智能电视支持 AirPlay——这个装机量意味着你的 AirPlay 集成能触达的用户远比你想象的多。
  • 全屋音频的多设备同步播放是 AirPlay 的核心卖点之一,增强音频缓冲进一步提升了这个体验的稳定性。
  • 如果你的应用同时播放视频和音频,注意 AirPlay 音频流和视频流是不同的集成路径。
WWDC 2023