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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 21:05:49