【问题标题】:Specifying number of frames to process in audiounit render callback on iOS在 iOS 上的 audiounit 渲染回调中指定要处理的帧数
【发布时间】:2013-05-30 16:53:55
【问题描述】:

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

    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)。

【问题讨论】:

    标签: ios callback audiounit


    【解决方案1】:

    您无法在 iOS 中指定确切的缓冲区大小,但您可以请求一个与给定大小相似的缓冲区。代码如下所示:

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

    所以基本上你需要在几秒钟内计算出首选的缓冲区大小(不是样本,这很奇怪),然后希望系统给你一个更符合你喜好的缓冲区大小。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多