2

我在我的应用程序中使用音频队列服务。分配缓冲区时,我将缓冲区大小设置为 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 个缓冲区。

4

1 回答 1

3

编辑:当出现非二次幂音频缓冲区时,我已经看到 iOS 吓坏了并自发地更改缓冲区大小。(另一个SO问题引用了这个)无论如何,

30000 是

(a) 巨大的缓冲区大小,以及

(b) 用于缓冲区的奇怪数字。通常它们是 2 的幂,*=2即 64 的幂,即 64、128、256、512、1024、2048、4096。我从未见过高于 4096 的,而且我做了很多音频工作。

如果您有特殊原因使用异常大的缓冲区,则可以使用nextPowerOfTwo便利函数或自己对数学进行硬编码。

于 2011-09-12T14:12:17.873 回答