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

AudioKit 5.2.2启动未获麦克风权限 后续授权后仍无法正常使用问题

问题根因

AudioKit 5.2.2底层依赖的系统AVAudioEngine组件,会在应用首次启动时初始化输入节点的配置,如果此时没有麦克风权限,系统会返回无效的输入采样格式,哪怕后续用户授予了权限,已经实例化的AudioEngine和关联的输入节点也不会自动刷新配置,因此不会产生任何输入回调。

你当前的代码逻辑中如果AudioEngine已经初始化过就会复用旧实例,如果应用启动后、权限授予前你触发过AudioEngine的初始化逻辑(哪怕只是判断engine.input是否存在),后续权限授予后复用旧实例就会触发这个问题。

修复方案

  1. 权限授予前绝对不要初始化任何AudioKit相关实例,包括AudioEngine、Mixer、Tap等,所有实例初始化逻辑都必须放在权限确认授权之后执行。
  2. 每次权限状态变更为已授权时,销毁所有旧的AudioKit实例,完全重新初始化,不要复用任何之前创建的对象。
  3. 补充完全销毁实例的方法,避免旧实例残留。

修改后的代码

var engine: AudioEngine?
var silencer: Fader?
var mixer: Mixer?
var tracker: AmplitudeTap?

func setup() -> Bool {
    // 每次setup先清空旧实例,完全重新初始化
    destroyAllAudioInstances()
    
    engine = AudioEngine()
    mixer = Mixer()

    guard let input = engine?.input else {
        return false
    }

    silencer = Fader(input, gain: 0)
    engine?.output = mixer

    tracker = AmplitudeTap(input) { amplitude in
        DispatchQueue.main.async {
            print("amplitude: \(amplitude)")
        }
    }

    return true
}

func start() {
    do {
        try tracker?.start()
        try engine?.start()
    } catch let err {
        print(err)
    }
}

func stop() {
    engine?.stop()
    tracker?.stop()
    destroyAllAudioInstances()
}

// 新增销毁所有音频实例的私有方法
private func destroyAllAudioInstances() {
    tracker?.dispose()
    tracker = nil
    silencer = nil
    mixer?.removeAllInputs()
    mixer = nil
    engine?.output = nil
    engine = nil
}

注意事项

确认Flutter侧请求麦克风权限的回调,是在用户点击允许之后才调用原生侧的setup方法,不要在权限请求还没返回结果的时候提前初始化任何AudioKit对象。如果仍无回调,可以在setup方法中打印AVAudioSession.sharedInstance().inputAvailable和engine.input.inputFormat(forBus: 0)的参数,确认授权后输入格式的采样率、通道数是否正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:06:04