iOS 16 RemoteIO:输入数据过程返回不一致的 2 个数据包

ndr*_*ndr 5 audiounit ios remoteio ios16

我在 iOS 16 中收到错误。此错误不会出现在以前的 iOS 版本中。我正在使用 RemoteIO 以 4000 Hz 播放实时音频。错误如下:

输入数据过程返回不一致的2个186字节数据包;每个数据包 2 字节,实际上是 93 个数据包

这是音频格式和回调的设置方式:

// 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));
Run Code Online (Sandbox Code Playgroud)

请注意,我设置的 mSampleRate 为 4000 Hz。在 iOS 15 中,我在每个回调中获得 0.02322 秒的缓冲持续时间 (IOBufferDuration) 和 93 帧。这是预期的,因为:

number of frames * buffer duration = sampling rate
93 * 0.02322 = 4000 Hz
Run Code Online (Sandbox Code Playgroud)

但是,在 iOS 16 中,我在回调中收到上述错误。

输入数据过程返回不一致的2个186字节数据包;每个数据包 2 字节,实际上是 93 个数据包

由于帧数等于数据包数,因此我在回调中收到 1 或 2 帧,并且缓冲区持续时间为 0.02322 秒。这并不影响“原始”信号的播放,但确实影响了“处理后”信号的播放。

number of frames * buffer duration = sampling rate
2 * 0.02322 = 0.046 Hz
Run Code Online (Sandbox Code Playgroud)

这没有任何意义。不同采样率(8000、16000、32000)会出现此错误,但 44100 不会出现此错误。但是我想保留 4000 作为我的采样率。

我还尝试使用 AVAudioSession 的 setPreferredSampleRate(_:) 函数设置采样率,但尝试没有成功。调用该函数后采样率仍然是44100。

任何有关此问题的帮助将不胜感激。