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

时间:2014-10-02 19:45:03

标签: macos audio core-audio audio-recording audioqueueservices

我使用音频队列服务在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帧?

1 个答案:

答案 0 :(得分:2)

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

204 * 240 + 192 = 12个音频单位缓冲区4096。

如果你想要不是2的幂的固定长度缓冲区,你最好的办法是让应用程序重新缓冲输入缓冲区(保存到你有足够的数据)到你想要的长度。无锁定的圆形FIFO /缓冲区可能适用于此目的。