如何用Audio Unit循环缓冲区播放Socket服务器PCM音频?遇-10865错误求助
解决OSX AudioUnit错误-10865("Error enabling AudioUnit output bus")的思路
嘿,刚接触Objective-C和OSX音频开发就碰到这个问题,确实挺闹心的!我来帮你拆解下这个-10865错误(对应kAudioUnitErr_InvalidPropertyValue,也就是属性值设置无效)的常见原因和解决办法:
一、先核对核心参数是否匹配
这个错误最常见的原因是音频格式不兼容,你得先确认这几点:
- 检查你设置的
AudioStreamBasicDescription(ASBD)是否和Socket接收的音频数据完全一致:采样率、位深(比如16位/32位)、声道数(单声道/立体声)、音频类型(比如PCM),哪怕有一项不匹配,AudioUnit都会拒绝启用输出总线。 - 举个例子,如果你的Socket接收的是44100Hz、16位、单声道的PCM数据,你的ASBD就得这么设置:
AudioStreamBasicDescription asbd = {0}; asbd.mSampleRate = 44100.0; asbd.mFormatID = kAudioFormatLinearPCM; asbd.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; asbd.mBitsPerChannel = 16; asbd.mChannelsPerFrame = 1; asbd.mBytesPerPacket = asbd.mBytesPerFrame = 2; // 1声道*16位/8=2字节 asbd.mFramesPerPacket = 1;
二、检查AudioUnitSetProperty的参数是否正确
你提到的那段代码,一定要确认这几个参数没传错:
Boolean enableFlag = YES; OSStatus status = AudioUnitSetProperty(_audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, // 重点:是Output不是Input 0, // 输出总线索引,OSX上默认是0 &enableFlag, sizeof(enableFlag));
- 别把
kAudioUnitScope_Output写成kAudioUnitScope_Input,后者是用来启用输入总线的,和输出无关; - 总线索引0是OSX音频输出的默认值,除非你用了多输出设备,否则别乱改这个数字。
三、确认AudioUnit的初始化顺序
AudioUnit的设置是有先后顺序的,必须按这个流程来:
- 创建AudioUnit实例并设置基本信息
- 设置音频格式(ASBD)
- 设置音频回调函数(用来从你的循环缓冲区取数据)
- 最后再调用
AudioUnitSetProperty启用输出总线
如果跳过前面的步骤直接启用IO,就会触发这个错误。
四、结合循环缓冲区的额外检查
既然你用了循环缓冲区来处理Socket的音频数据,还要确认:
- 回调函数里从缓冲区读取的数据长度,要和AudioUnit要求的帧数量匹配;
- 缓冲区里的音频数据格式,要和你设置的ASBD完全一致,别出现字节序错误(比如小端/大端不匹配)。
内容的提问来源于stack exchange,提问作者akaiz
相关产品推荐
相关产品推荐

