如何结合AudioKit使用AVAudioSinkNode且不中断原有音频流?
解决AudioKit中AVAudioSinkNode与原有音频流程共存的问题
你碰到的核心问题在于:把AVAudioSinkNode连到Fader后,原有音频链(Input→Fader→Output)就断了,听不到声音;不连的话SinkNode又拿不到音频数据。这是因为直接调用avEngine.connect会覆盖Fader原有的输出连接,导致它不再往系统输出流音频。
解决思路很简单:让Fader的音频同时流向系统输出和SinkNode,做一个音频分支。具体要明确把Fader连接到两个目标节点,而不是覆盖原来的连接。
修改后的代码如下:
import AudioKit class AudioProcessor { let engine: AudioEngine let sinkNode: AVAudioSinkNode let inputMonitoringNode: Fader private init() { engine = AudioEngine() // 初始化输入节点和Fader guard let inputNode = engine.input else { fatalError("无法获取音频输入节点") } inputMonitoringNode = Fader(inputNode) // 初始化SinkNode,处理音频数据 sinkNode = AVAudioSinkNode() { (timestamp, frames, audioBufferList) in // 把音频缓冲区存到其他线程处理 // 这里替换成你的业务逻辑 return noErr } } func start() { do { try engine.start() } catch let err { print("启动音频引擎失败: \(err)") return } guard !engine.avEngine.attachedNodes.contains(sinkNode) else { return } // 把SinkNode附加到音频引擎 engine.avEngine.attach(sinkNode) // 获取Fader的输出格式,保证连接格式一致 let outputFormat = inputMonitoringNode.avAudioNode.outputFormat(forBus: 0) // 1. 把Fader连到AudioEngine的主混音器——这是音频能输出到系统的关键 engine.avEngine.connect( inputMonitoringNode.avAudioNode, to: engine.mainMixerNode, fromBus: 0, toBus: engine.mainMixerNode.nextAvailableInputBus, format: outputFormat ) // 2. 把Fader连到SinkNode——让SinkNode能拿到音频数据 engine.avEngine.connect( inputMonitoringNode.avAudioNode, to: sinkNode, fromBus: 0, toBus: 0, format: outputFormat ) } // 单例实例,方便调用 static let shared = AudioProcessor() }
关键改动说明:
- 不再直接设
engine.output = inputMonitoringNode,而是手动把Fader连到AudioEngine的mainMixerNode——这个节点负责把音频输出到系统扬声器。 - 用带总线参数的
connect方法,明确指定Fader的输出总线同时连到主混音器和SinkNode,避免覆盖原来的连接。 - 统一连接格式,用Fader的输出格式作为连接参数,防止格式不匹配导致的异常。
这样调整后,Fader的音频会同时分流到系统输出(你能听到声音)和SinkNode(可以拿到数据做处理),两者互不影响,完美解决你遇到的问题。
内容的提问来源于stack exchange,提问作者Rene
相关产品推荐
相关产品推荐

