iOS,音频队列:缓冲区大小不是恒定的

时间:2011-06-11 20:24:40

标签: iphone ios audioqueueservices audioqueue

我在我的应用程序中使用音频队列服务。分配缓冲区时,我将缓冲区大小设置为30000个样本:

AudioQueueAllocateBuffer(mQueue, 30000, &mBuffers[i]);

但随后的回调调用是使用以下 inNumberPacketDescriptions 进行的:

30000
30000
30000
26928
30000
30000

它们并不总是等于30000. 为什么?

记录格式配置(使用 CAStreamBasicDescription ):

mRecordFormat.mSampleRate = kSampleRate;    
mRecordFormat.mChannelsPerFrame = 1;
mRecordFormat.mFormatID = kAudioFormatLinearPCM;
mRecordFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;
mRecordFormat.mBitsPerChannel = 16;
mRecordFormat.mBytesPerPacket = mRecordFormat.mBytesPerFrame = (mRecordFormat.mBitsPerChannel / 8) * mRecordFormat.mChannelsPerFrame;
mRecordFormat.mFramesPerPacket = 1;
使用

3 缓冲区。

1 个答案:

答案 0 :(得分:3)

编辑:我看到iOS出现了疯狂的情况,并且在使用非二次幂音频缓冲区时会自发地更改缓冲区大小。 (Another SO question引用此)无论如何,

30000

(a)HUGE缓冲区大小,

(b)用于缓冲区的奇怪数字。通常它们的强度为2,即*=2从64,即64,128,256,512,1024,2048,4096。我从来没有见过高于4096的一个,我做了很多音频工作。

如果您有专门的理由使用异常大的缓冲区,您可以使用nextPowerOfTwo便利功能,或者自己对数学进行硬编码。