我在我的应用程序中使用音频队列服务。分配缓冲区时,我将缓冲区大小设置为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 缓冲区。
答案 0 :(得分:3)
编辑:我看到iOS出现了疯狂的情况,并且在使用非二次幂音频缓冲区时会自发地更改缓冲区大小。 (Another SO question引用此)无论如何,
30000
(a)HUGE缓冲区大小,
(b)用于缓冲区的奇怪数字。通常它们的强度为2,即*=2
从64,即64,128,256,512,1024,2048,4096。我从来没有见过高于4096的一个,我做了很多音频工作。
如果您有专门的理由使用异常大的缓冲区,您可以使用nextPowerOfTwo
便利功能,或者自己对数学进行硬编码。