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
相关产品推荐
相关产品推荐

