使用AVAudioEngine与kAudioUnitSubType_MatrixMixer设置音量报错-10867的原因
问题分析与解决方案
错误原因
你遇到的kAudioUnitErr_Uninitialized(-10867)错误,核心原因有两点:
误用未初始化的AudioUnit实例
在AVAudioUnit.instantiate的回调中,你直接调用了外部的avAudioUnit!,但这个实例并未被当前回调返回的mixerUnit赋值,处于未初始化状态。而总线设置代码能运行,大概率是后续代码中avAudioUnit被意外赋值,但音量设置代码先执行,因此触发未初始化错误。参数设置顺序错误
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
相关产品推荐
相关产品推荐

