Mac上AVAudioEngine麦克风输入干扰低优先级系统声音求助
解决AVAudioEngine干扰Mac低优先级系统声音的问题
核心修复:配置音频会话允许混合播放
Mac 下启动 AVAudioEngine 获取麦克风输入时,默认的音频会话配置会抢占音频资源,导致低优先级系统声音(如程序坞操作、Outlook提示)播放异常。通过以下步骤修改配置即可解决:
import Cocoa import AVFAudio func startAudioEngine() { // 先配置音频会话,这是解决问题的关键 do { let session = AVAudioSession.sharedInstance() // 使用.record类别仅获取麦克风输入,同时允许与其他音频混合 try session.setCategory(.record, mode: .default, options: [.mixWithOthers]) try session.setActive(true, options: .notifyOthersOnDeactivation) } catch { print("音频会话配置失败: \(error.localizedDescription)") return } audioEngine = AVAudioEngine() inputBus = AVAudioNodeBus(0) inputFormat = audioEngine.inputNode.inputFormat(forBus: inputBus) do { try audioEngine.start() } catch { print("无法启动AVAudioEngine: \(error.localizedDescription)") } }
额外优化建议
优化分析回调队列
如果你为输入节点添加了 SoundAnalysis 的分析 Tap,确保回调在后台队列执行,避免阻塞音频线程:let analysisQueue = DispatchQueue(label: "com.your.app.analysis", qos: .utility) audioEngine.inputNode.installTap(onBus: inputBus, bufferSize: 1024, format: inputFormat) { buffer, time in // 所有分析逻辑放在此队列,不要阻塞主线程或音频线程 }匹配采样率
前往「系统设置 > 声音 > 输入」,确认麦克风的采样率与inputFormat一致,避免格式转换带来的延迟干扰。备选类别配置
若.record类别仍有问题,可尝试切换到.playAndRecord(即使不需要输出):try session.setCategory(.playAndRecord, mode: .default, options: [.mixWithOthers, .defaultToSpeaker])
问题原因
低优先级系统声音的播放优先级低于主动激活的音频会话。未配置 .mixWithOthers 时,系统会暂停或重新路由这类声音,导致播放缓冲区被重复触发,表现为声音末尾重复两次。配置混合选项后,音频会话与系统声音流共存,避免了资源抢占。
内容的提问来源于stack exchange,提问作者granpaJones
相关产品推荐
相关产品推荐

