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

使用AVAudioEngine与kAudioUnitSubType_MatrixMixer设置音量报错-10867的原因

问题分析与解决方案

错误原因

你遇到的kAudioUnitErr_Uninitialized(-10867)错误,核心原因有两点:

  1. 误用未初始化的AudioUnit实例
    在AVAudioUnit.instantiate的回调中,你直接调用了外部的avAudioUnit!,但这个实例并未被当前回调返回的mixerUnit赋值,处于未初始化状态。而总线设置代码能运行,大概率是后续代码中avAudioUnit被意外赋值,但音量设置代码先执行,因此触发未初始化错误。

  2. 参数设置顺序错误
    MatrixMixer音频单元要求先配置总线数量,再设置音量等参数。你当前先调用AudioUnitSetParameter设置音量,此时音频单元的总线结构还是默认状态,内部未完成对应参数的初始化,也会导致未初始化错误。

修复后的代码示例

var mixerUnitDescription = AudioComponentDescription()
mixerUnitDescription.componentType          = kAudioUnitType_Mixer;
mixerUnitDescription.componentSubType       = kAudioUnitSubType_MatrixMixer;
mixerUnitDescription.componentManufacturer  = kAudioUnitManufacturer_Apple;
mixerUnitDescription.componentFlags         = 0;
mixerUnitDescription.componentFlagsMask     = 0;

var avAudioUnit: AVAudioUnit?

AVAudioUnit.instantiate(with: mixerUnitDescription) { [self] mixerUnit, error in
    guard let mixerUnit = mixerUnit, error == nil else {
        // 处理实例化错误
        return
    }
    avAudioUnit = mixerUnit
    
    var numInputBuses: UInt32 = 2
    var numOutputBuses: UInt32 = 1
    
    // 先配置输入总线数量
    var status = AudioUnitSetProperty(
        mixerUnit.audioUnit,
        AudioUnitPropertyID(kAudioUnitProperty_ElementCount),
        AudioUnitScope(kAudioUnitScope_Input),
        0,
        &numInputBuses,
        UInt32(MemoryLayout<UInt32>.size)
    )
    guard status == noErr else {
        // 处理总线设置错误
        return
    }
    
    // 再配置输出总线数量
    status = AudioUnitSetProperty(
        mixerUnit.audioUnit,
        AudioUnitPropertyID(kAudioUnitProperty_ElementCount),
        AudioUnitScope(kAudioUnitScope_Output),
        0,
        &numOutputBuses,
        UInt32(MemoryLayout<UInt32>.size)
    )
    guard status == noErr else {
        // 处理总线设置错误
        return
    }
    
    // 循环设置所有输入总线到输出总线的增益为1.0
    for inputBus in 0..<Int(numInputBuses) {
        status = AudioUnitSetParameter(
            mixerUnit.audioUnit,
            kMatrixMixerParam_Volume,
            kAudioUnitScope_Input,
            UInt32(inputBus),
            1.0,
            0
        )
        guard status == noErr else {
            // 处理音量设置错误
            return
        }
    }
}

额外说明

  • MatrixMixer的kMatrixMixerParam_Volume参数需要指定具体的输入总线索引(而非0xFFFFFFFF),因为该参数针对单个输入总线到输出总线的增益设置。批量设置需循环遍历每个输入总线。
  • 完成总线配置和参数设置后,需将avAudioUnit附加到AVAudioEngine并启动引擎,才能让音频单元进入正常工作状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 09:10:10