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

如何结合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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 17:39:24