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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:06:03