iphone - iOS,音频队列: Buffer size is not contant

标签 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个缓冲区。

最佳答案

编辑:我见过 iOS 在遇到非 2 的幂音频缓冲区时会崩溃并自发地更改缓冲区大小。 ( Another SO question 引用此)无论如何,

30000 是

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

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

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

关于iphone - iOS,音频队列: Buffer size is not contant,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6318354/

相关文章:

iphone - facebook ios sdk 无法工作。 iPhone

ios - AudioFileReadPacketData 在传递有效文件时返回 -50

iphone - 如何限制我的应用程序仅在 OS 3.0 系列(或更早版本)上运行,而不在 OS 4.0 上运行?

iOS 应用程序在 ogg vorbis 库上随机崩溃

iphone - 如果我在 photoshop 中创建了一个 85% 不透明度的 PNG 图像,当我将它添加到我的 iOS 应用程序时,我如何保持相同的不透明度?

ios - 添加自定义手势识别器以在 Xcode Interface Builder 中查看?

ios - Apple App Store 和带有付费激活 key 的免费应用程序

ios - 是否可以通过 API 在应用程序内进行转发?

iphone - 播放音频和视频内容的正确选择

iphone - 使用 Objective C(音频队列服务)从 FFMPeg 获取准确时间