2

我设置了音频单元渲染回调:

    AURenderCallbackStruct input;
    input.inputProc = RenderAudioBuffer;
    input.inputProcRefCon = self;
    err = AudioUnitSetProperty(audioPlaybackUnit,
                               kAudioUnitProperty_SetRenderCallback,
                               kAudioUnitScope_Input,
                               0,
                               &input,
                               sizeof(input));

这是回调方法:

OSStatus RenderAudioBuffer( void                         *inRefCon,
                                   AudioUnitRenderActionFlags   *ioActionFlags,
                                   const AudioTimeStamp         *inTimeStamp,
                                   UInt32                       inBusNumber,
                                   UInt32                       inNumberFrames,
                                   AudioBufferList              *ioData)

{
}

在回调方法中,inNumberFrames 始终为 1024,如何更改?我一次有超过 1024 帧要渲染(64K)。

4

1 回答 1

6

您无法在 iOS 中指定确切的缓冲区大小,但您可以请求与给定大小相似的缓冲区大小。代码看起来像这样:

Float32 bufferSizeInSec = 0.02f;
if(AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration,
  sizeof(Float32), &bufferSizeInSec) != noErr) {
  return 1;
}

因此,基本上您需要以秒为单位计算首选缓冲区大小(不是样本,这很奇怪),然后希望系统为您提供更符合您喜好的缓冲区大小。

但是,您可能以错误的方式看待这个问题。AudioUnits 用于实时处理,因此较小的缓冲区是首选。64K 的缓冲区大小大得离谱,而 1024 帧实际上对于现代 iPhone/iPad 来说相当大,可以舒适地处理。您的算法需要“基于块”,这意味着您应该分解逻辑,以便它可以在 64 次调用中处理 64K 样本,每个调用有 1024 帧。这将导致最健壮的代码。

于 2013-06-24T08:23:18.897 回答