iOS,音频队列:缓冲区大小不包含

问题描述:

我在我的应用程序中使用音频队列服务。当分配的缓冲区,我设置缓冲区的大小为30000个样品:iOS,音频队列:缓冲区大小不包含

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; 

缓冲器被使用。

+0

这是在一个单一的录音会议?通常最后的块将小于30000,因为没有那么多的样本。你是否在包计数小于30000的点上暂停并恢复记录?另外你如何在'AudioStreamBasicDescription'中配置数据格式? – Anurag 2011-06-11 20:38:57

+0

没有停顿或停顿。附加的记录格式配置。 – alexey 2011-06-11 21:00:39

编辑:我已经看到iOS在出现非幂级别的音频缓冲区时会自动改变缓冲区大小。 (Another SO question引用此)无论如何,

30000是

(a)一种巨大的缓冲器大小,并

(b)向用于缓冲一个奇异数。通常它们的功率是2,即从0到64,即64,128,256,512,1024,2048,4096,即*=2。我从未见过高于4096的音频,我做了很多音频工作。

如果您有一个特殊的理由使用非常大的缓冲区,您可以使用便利功能或只是自己对数学进行硬编码。

+0

也许,但它不是问题的答案为什么。如果缓冲区大小是2的幂,它会一直保持不变吗? – alexey 2011-09-12 15:07:49

+0

@alexey请参阅编辑。 – buildsucceeded 2011-09-12 15:36:08

+0

@buildsucceeded - 谢谢。 upvote for you。试图解决为什么我写的一些代码在ipad mini和在模拟器上的IOs7上工作得很好,但在iPhone 4s上忽略了所有音频数据。把缓冲区大小放下来,然后嘿嘿。有用的工作。 – unsynchronized 2013-11-05 08:51:48