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

AudioKit:EZMicrophone与AKOscillator、AKMixer配合异常咨询

解决方案建议

这种真机与模拟器的行为差异确实挺棘手的,结合AudioKit的底层工作逻辑,给你几个针对性的解决方向:

1. 强制配置支持录音+播放的音频会话

真机的AVAudioSession对音频类别限制比模拟器严格,当你切换到仅播放类别的会话时,系统会自动暂停录音输入。你需要确保会话类别同时支持录音和播放:

do {
    // 配置会话为同时支持录音和播放,允许与其他音频混合
    try AVAudioSession.sharedInstance().setCategory(
        .playAndRecord,
        mode: .default,
        options: [.mixWithOthers, .allowBluetooth]
    )
    try AVAudioSession.sharedInstance().setActive(true)
} catch {
    print("音频会话配置失败: \(error.localizedDescription)")
}

建议在初始化AudioKit前或者切换输出节点时执行这段配置,确保录音输入不会被系统禁用。

2. 让EZMicrophone接入音频链路避免被优化

真机的音频引擎会自动停用未接入输出链路的节点(节省资源),而模拟器没有这个优化逻辑。你可以把EZMicrophone通过一个静音的AKBooster接入到混音器中,这样它就会被音频引擎持续激活:

// 初始化麦克风和静音增益器
let mic = EZMicrophone()
let micMuteBooster = AKBooster(mic, gain: 0) // 增益设为0,不影响振荡器输出

// 初始化振荡器和混音器
let oscillator = AKOscillator()
let mixer = AKMixer(oscillator, micMuteBooster)

// 设置混音器为输出并启动AudioKit
AudioKit.output = mixer
try! AudioKit.start()

这样即使你只需要EZMicrophone的缓冲区回调,它也会因为属于音频链路的一部分,持续推送数据到你的循环队列中。

3. 切换输出后重新注册缓冲区回调

有时候切换AudioKit输出节点时,EZMicrophone的回调监听可能会意外失效。你可以在设置AudioKit.output之后,重新启动麦克风并注册回调:

// 切换输出后重新启动麦克风并绑定回调
mic.stopRecording()
mic.startRecording(withBufferCallback: { buffer, time in
    // 你的循环队列存入逻辑
})

4. 校验录音权限状态

虽然之前功能正常,但音频会话切换可能触发系统的权限重新校验。你可以在运行时检查权限状态,确保录音权限未被意外收回:

func checkRecordingPermission() {
    switch AVAudioSession.sharedInstance().recordPermission {
    case .granted:
        print("录音权限已授权")
    case .denied:
        print("录音权限被拒绝,请在设置中开启")
    case .undetermined:
        AVAudioSession.sharedInstance().requestRecordPermission { granted in
            if granted {
                DispatchQueue.main.async {
                    // 重新初始化麦克风
                }
            }
        }
    @unknown default:
        break
    }
}

这些方法里,第2点是最可能解决你问题的,因为真机的音频节点激活机制和模拟器差异最大,未接入链路的节点很容易被休眠。

内容的提问来源于stack exchange,提问作者jhhl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:42:49