iOS如何设置AVAudioPlayer强制输出到听筒扬声器不随通话模式切换
解决方案
核心原理
iOS 中 AVAudioSession 的 playAndRecord 分类默认输出端口为听筒,只要不主动调用 overrideOutputAudioPort 到 speaker,就能固定音频从听筒输出,不受全局通话免提状态影响。
需要修改的核心配置
- 将原有的
playback分类替换为playAndRecord分类,同时添加.mixWithOthers选项保证不会打断当前正在进行的通话 - 不需要调用任何输出端口覆写到扬声器的代码,保持默认输出即可
- 可选添加
.duckOthers选项让通话音量临时降低,突出提示音效果
修改后完整代码
var player: AVAudioPlayer? func playSound() { guard let url = Bundle.main.url(forResource: alarmType, withExtension: ext) else { return } do { let session = AVAudioSession.sharedInstance() // 核心配置:使用playAndRecord分类,默认输出到听筒,添加选项兼容当前通话 try session.setCategory(.playAndRecord, mode: .voiceChat, options: [.mixWithOthers, .duckOthers]) try session.setActive(true) player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue) guard let player = player else { return } player.play() isItPlayed = true // 播放完成后恢复会话原始状态,避免影响后续音频行为 player.delegate = self } catch let error { print(error.localizedDescription) } } // 实现AVAudioPlayerDelegate代理方法,播放完成后复位会话 extension YourViewController: AVAudioPlayerDelegate { func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { do { try AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation) } catch { print(error.localizedDescription) } } }
注意事项
- 确认项目已经开启音频相关权限,如果需要后台播放提示音需要开启音频后台模式
- iOS 15 及以上版本可配合
AVAudioSession的preferredOutputNumberOfChannels配置优化听筒音质 - 播放完成后主动停用当前会话并通知其他应用,可避免通话音频出现异常
内容的提问来源于stack exchange,提问作者Deyan
相关产品推荐
相关产品推荐

