You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AVRoutePicker选中AirPlay设备后音频仍从手机扬声器输出问题求解

问题核心原因

  • 你当前使用的AVAudioSession.Category.playAndRecord类别默认禁用了AirPlay路由支持,这是AirPlay设备选中后仍无声音的根本原因
  • overrideOutputAudioPort接口仅作用于本地音频输出路由,仅能切换耳机/听筒/本地扬声器,完全不支持控制AirPlay路由

具体修复步骤

1. 调整AVAudioSession配置,增加AirPlay支持

设置音频会话类别时,添加.allowAirPlay选项,若需要保持录音能力,可按需额外添加.allowBluetooth等配置,修改后的配置代码:

do {
    // 新增options参数添加AirPlay支持
    try self.recordingSession.setCategory(.playAndRecord, options: [.allowAirPlay, .allowBluetooth, .defaultToSpeaker])
    try self.recordingSession.setActive(true)
} catch {
    print("Couldn't set Audio session category: \(error)")
}

2. 删除overrideOutputAudioPort相关调用代码

这个接口会强制覆盖音频输出到本地扬声器,优先级高于系统路由选择,会直接导致AirPlay路由失效。如果你需要手动切换本地扬声器/听筒,仅在不需要AirPlay的场景下调用该接口即可。

3. 修复AVRoutePickerView的使用问题

你当前每次点击按钮都新建了一个AVRoutePickerView并添加到视图,临时对象会被系统提前释放导致路由监听失效,正确的做法是将AVRoutePickerView作为全局属性持有,仅初始化一次:

// 类内定义全局属性
var routePickerView: AVRoutePickerView!

// viewDidLoad中初始化一次即可
override func viewDidLoad() {
    super.viewDidLoad()
    routePickerView = AVRoutePickerView(frame: CGRect(x: 0, y: 0, width: 40, height: 40))
    // 可以添加到导航栏或者自定义视图位置,不需要每次点击都新建
    navigationItem.rightBarButtonItem = UIBarButtonItem(customView: routePickerView)
    
    // 其余原有代码...
}

额外说明

  • playAndRecord类别下的AirPlay仅支持音频输出,如果不需要录音功能,建议直接切换为.playback类别,该类别默认支持AirPlay,无需额外配置选项
  • 每次切换路由后如果音频正在播放,建议先停止再重启播放,避免部分设备路由切换后无声音的问题

内容的提问来源于stack exchange,提问作者Greg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 15:39:01