为什么我的音频队列输入回调中的数据包编号有所不同?
问题描述:
我使用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 /缓冲器可能适用于此目的。