iPhone录音时如何避免收录扬声器播放的服务器音频?
解决麦克风录制到扬声器播放音频的问题
核心原因
当前音频会话配置使用.videoRecording模式,仅设置.defaultToSpeaker选项,未充分启用iOS内置的回声消除机制,导致扬声器播放的音频被麦克风拾取。
解决方案
1. 调整音频会话配置
将音频会话模式改为.voiceChat(内置回声消除,适配边播边录的场景),补充必要选项确保回声消除功能生效:
self.recordingSession = AVAudioSession.sharedInstance() do { try recordingSession.setCategory(AVAudioSession.Category.playAndRecord, mode: .voiceChat, options: [.defaultToSpeaker, .allowBluetooth]) try recordingSession.setActive(true) recordingSession.requestRecordPermission() { [unowned self] allowed in DispatchQueue.main.async { if allowed { self.startRecording() } else { // 录音权限被拒绝 } } } } catch { // 音频会话激活失败 }
2. 优化播放逻辑
避免主线程同步加载音频数据,改为异步加载并确保播放器遵循当前音频会话配置:
func playSound(url: URL) { DispatchQueue.global().async { do { print("Play URL:", url) let data = try Data(contentsOf: url) DispatchQueue.main.async { do { self.audioPlayer = try AVAudioPlayer(data: data) self.audioPlayer.delegate = self self.audioPlayer.volume = 1.0 self.audioPlayer.prepareToPlay() self.audioPlayer.play() } catch let error { print(error.localizedDescription) } } } catch let error { print(error.localizedDescription) } } }
3. 额外优化建议
- 若无需扬声器播放,可移除
.defaultToSpeaker选项,音频默认通过听筒输出,大幅降低麦克风拾取播放音频的概率; - 测试选择安静环境,避免环境噪音干扰排查;
- 部分老旧iOS设备回声消除功能有限,需针对性适配。
内容的提问来源于stack exchange,提问作者iDeveloper
相关产品推荐
相关产品推荐

