我使用音频队列服务在Mac OS X上录制PCM音频数据。它可以工作,但我在回调中获得的帧数会有所不同。
static void MyAQInputCallback(void *inUserData, AudioQueueRef inQueue, AudioQueueBufferRef inBuffer, const AudioTimeStamp *inStartTime, UInt32 inNumPackets, const AudioStreamPacketDescription *inPacketDesc)
在我的音频输入队列的每次调用中,我想获得5 ms(240帧/ inNumPackets
,48 kHz)的音频数据。
这是我使用的音频格式:
AudioStreamBasicDescription recordFormat = {0};
memset(&recordFormat, 0, sizeof(recordFormat));
recordFormat.mFormatID = kAudioFormatLinearPCM;
recordFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked;
recordFormat.mBytesPerPacket = 4;
recordFormat.mFramesPerPacket = 1;
recordFormat.mBytesPerFrame = 4;
recordFormat.mChannelsPerFrame = 2;
recordFormat.mBitsPerChannel = 16;
我有两个960字节的缓冲区:
for (int i = 0; i < 2; ++i) {
AudioQueueBufferRef buffer;
AudioQueueAllocateBuffer(queue, 960, &buffer);
AudioQueueEnqueueBuffer(queue, buffer, 0, NULL);
}
我的问题:对于240帧(inNumPackets
)的每204次,回调一次仅用192帧调用。
为什么会发生这种情况,我能做些什么才能不断获得240帧?
答案 0 :(得分:2)
音频队列运行在音频单元之上。操作系统很可能将音频单元缓冲区配置为2的二次幂,并且返回的音频队列缓冲区将从较大的音频单元缓冲区中切除。
204 * 240 + 192 = 12个音频单位缓冲区4096。
如果你想要不是2的幂的固定长度缓冲区,你最好的办法是让应用程序重新缓冲输入缓冲区(保存到你有足够的数据)到你想要的长度。无锁定的圆形FIFO /缓冲区可能适用于此目的。