AVPlayer播放录制视频音频随机输出到听筒 如何默认使用底部扬声器?
问题根因
你当前使用的playAndRecord音频会话类别,系统默认输出端口为听筒,代码中设置的AVAudioSession.PortOverride.none会保留该默认行为,因此会出现音频随机从听筒播放的问题。
解决方案
根据你的使用场景可以选择以下两种方案:
方案1:需同时保留录音权限(如边录边预览场景)
直接修改原有音频会话配置,给类别添加默认扬声器选项即可:
let session = AVAudioSession.sharedInstance() do { // 给playAndRecord添加defaultToSpeaker选项,默认输出到扬声器 try session.setCategory(.playAndRecord, options: .defaultToSpeaker) try session.setActive(true) } catch { print ("音频会话设置失败:\(error.localizedDescription)") }
该方案的稳定性优于单独调用overrideOutputAudioPort,可以避免音频中断后配置失效的问题。
方案2:录制结束后仅需回放(无录音需求,更推荐)
录制停止后直接切换到回放专用的音频会话类别,更符合系统场景设计规范,默认优先从扬声器输出:
// 停止AVCaptureSession之后、启动AVPlayer回放前执行 let session = AVAudioSession.sharedInstance() do { // playback为回放专用类别,默认走扬声器输出 try session.setCategory(.playback, mode: .moviePlayback) try session.setActive(true) } catch { print ("音频会话切换失败:\(error.localizedDescription)") }
注意事项
- 音频会话配置/切换操作必须在停止
AVCaptureSession之后、初始化AVPlayer回放之前执行 - 如果需要支持后台播放,需要在项目的「Signing & Capabilities」中开启Background Modes,勾选「Audio, AirPlay, and Picture in Picture」选项
- 用户插入有线/无线耳机时,系统会自动将音频路由切换到耳机,符合正常使用习惯,不需要额外配置
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

