我设置音频单元渲染回调:
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帧。
答案 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帧。这将导致最强大的代码。