2

오디오 대기열 서비스를 사용하여 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에서)을 얻을합니다.

이 내가 사용하는 오디오 형식입니다

for (int i = 0; i < 2; ++i) { 
    AudioQueueBufferRef buffer; 
    AudioQueueAllocateBuffer(queue, 960, &buffer); 
    AudioQueueEnqueueBuffer(queue, buffer, 0, NULL); 
} 

내 문제 :

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 바이트의 두 버퍼가 큐에있는 240 프레임마다 204 배 (inNumPackets) 콜백을 위해 한 번만 192 프레임 만 호출됩니다.

왜 그런 일이 발생하고 240 프레임을 지속적으로 얻을 수 있습니까?

답변

2

오디오 대기열은 오디오 단위 위에 실행됩니다. Audio Unit 버퍼는 OS에 의해 2의 2의 멱승으로 구성 될 가능성이 높으며 반환 된 Audio Queue 버퍼는 더 큰 Audio Unit 버퍼에서 잘려나갑니다.

204 * 240 + 192 = A는 전력의-이, 당신의 최선의 앱이 수신을 다시 버퍼링하는 것입니다하지 않습니다 당신이 길이 버퍼를 해결하려면 4096

12 개 오디오 단위 버퍼 원하는 길이로 버퍼 (충분한 데이터가 생길 때까지 저장). 잠금없는 원형 FIFO/버퍼가이 목적에 적합 할 수 있습니다.