iOS 16下RemoteIO播放4000Hz音频出现数据包不一致错误求助
iOS 16 RemoteIO 4000Hz实时音频播放错误问题
错误信息
Input data proc returned inconsistent 2 packets for 186 bytes; at 2 bytes per packet, that is actually 93 packets
音频格式与回调设置代码
// Set the Audio format AudioStreamBasicDescription audioFormat; audioFormat.mSampleRate = 4000; audioFormat.mFormatID = kAudioFormatLinearPCM; audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked; audioFormat.mFramesPerPacket = 1; audioFormat.mChannelsPerFrame = 1; audioFormat.mBitsPerChannel = 16; audioFormat.mBytesPerPacket = 2; audioFormat.mBytesPerFrame = 2; AURenderCallbackStruct callbackStruct; // Set output callback callbackStruct.inputProc = playbackCallback; callbackStruct.inputProcRefCon = (__bridge void * _Nullable)(self); status = AudioUnitSetProperty(audioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, kOutputBus, &callbackStruct, sizeof(callbackStruct));
现象差异分析
- iOS 15及更早版本:回调每次返回93帧数据,IOBufferDuration为0.02322秒,符合采样率预期:
93 * 0.02322 ≈ 4000 Hz - iOS 16:回调仅返回1或2帧数据,但IOBufferDuration仍为0.02322秒,计算结果完全不符合设定采样率:
2 * 0.02322 ≈ 0.046 Hz - 错误触发规律:在8000Hz、16000Hz、32000Hz采样率下均会出现,44100Hz时无问题;尝试用
AVAudioSession的setPreferredSampleRate(_:)设置采样率失败,实际采样率仍为44100Hz。
解决思路
- 强制RemoteIO硬件层面适配采样率:
除了设置AudioStreamBasicDescription的mSampleRate,还需为RemoteIO的输入/输出总线明确设置采样率属性,确保系统硬件适配目标采样率:Float64 targetSampleRate = 4000.0; status = AudioUnitSetProperty(audioUnit, kAudioUnitProperty_SampleRate, kAudioUnitScope_Input, kInputBus, &targetSampleRate, sizeof(targetSampleRate)); status = AudioUnitSetProperty(audioUnit, kAudioUnitProperty_SampleRate, kAudioUnitScope_Output, kOutputBus, &targetSampleRate, sizeof(targetSampleRate)); - 调整IO缓冲区大小匹配采样率:
通过AVAudioSession设置preferredIOBufferDuration为对应93帧的时长(0.02322秒),设置前需先激活音频会话并检查返回状态,确保缓冲区大小与4000Hz采样率兼容。 - 修正回调函数的帧计数逻辑:
回调中严格按照inNumberFrames参数返回对应数量的帧数据(因mFramesPerPacket=1,数据包数需等于帧数),确保输出字节数为inNumberFrames * 2(单声道16位采样),避免返回固定帧数量导致与系统预期冲突。 - 适配iOS 16音频架构变化:
若仅做播放功能,禁用RemoteIO的输入总线,避免输入/输出采样率不匹配引发的逻辑冲突;检查AudioComponentInstanceNew初始化RemoteIO时的配置,确认是否需要新增属性以支持低采样率模式。
内容的提问来源于stack exchange,提问作者ndr
相关产品推荐
相关产品推荐

