为什么我的音频队列输入回调中的数据包编号有所不同?

问题描述:

我使用Audio Queue Services在Mac OS X上录制PCM音频数据。它可以工作,但我在回调中获得的帧数有所不同。为什么我的音频队列输入回调中的数据包编号有所不同?

static void MyAQInputCallback(void *inUserData, AudioQueueRef inQueue, AudioQueueBufferRef inBuffer, const AudioTimeStamp *inStartTime, UInt32 inNumPackets, const AudioStreamPacketDescription *inPacketDesc) 

在我的音频输入队列中的每个呼叫我想要得到的音频数据的5毫秒(240帧/ inNumPackets,48千赫)。

这是音频格式我使用:

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); 
} 

我的问题:对于(inNumPackets)240帧的每204次回调曾经只有192帧被调用。

为什么会发生这种情况,并且有什么我可以做的,以不断获得240帧?

音频队列运行在音频单元之上。音频单元缓冲区很可能由操作系统配置为2的幂级,并且返回的音频队列缓冲区将从较大的音频单元缓冲区中切除。

204 * 240 + 192 =不在上电的二,最好的办法是让应用程序重新缓冲传入的4096

12级音频单元的缓冲器。如果你想固定长度的缓冲器缓冲区(保存直到你有足够的数据)到你想要的长度。无锁循环FIFO /缓冲器可能适用于此目的。