在iOS上指定要在audiounit渲染回调中处理的帧数

时间:2013-05-30 16:53:56

标签: ios callback audiounit

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

    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.如何更改?我在渲染的时刻(64K)有超过1024帧。

1 个答案:

答案 0 :(得分:4)

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

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

所以基本上你需要以秒为单位计算首选缓冲区大小(不是样本,非常奇怪),然后希望系统根据你的喜好给你一个缓冲区大小。

然而,你可能错误地看待这个问题。 AudioUnits用于实时处理,因此首选小缓冲区。 64K的缓冲区非常大,1024帧实际上相当大,现代iPhone / iPad可以轻松处理。您的算法需要“基于块”,这意味着您应该分解逻辑,以便它可以处理64个调用中的64K样本,每个调用1024帧。这将导致最强大的代码。