2011-06-11 3 views
2

오디오 대기열 서비스을 내 애플리케이션에 사용합니다. 그들은 항상 동일하지iOS, 오디오 대기열 : 버퍼 크기가 맞지 않습니다.

30000 
30000 
30000 
26928 
30000 
30000 

다음 inNumberPacketDescriptions로 만들어집니다

AudioQueueAllocateBuffer(mQueue, 30000, &mBuffers[i]); 

을하지만 콜백의 후속 호출 : 버퍼를 할당 할 때, 나는 30000 개 샘플 버퍼 크기를 설정 30000까지. 왜? (CAStreamBasicDescription 사용)

기록 포맷의 구성 :

mRecordFormat.mSampleRate = kSampleRate;  
mRecordFormat.mChannelsPerFrame = 1; 
mRecordFormat.mFormatID = kAudioFormatLinearPCM; 
mRecordFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked; 
mRecordFormat.mBitsPerChannel = 16; 
mRecordFormat.mBytesPerPacket = mRecordFormat.mBytesPerFrame = (mRecordFormat.mBitsPerChannel/8) * mRecordFormat.mChannelsPerFrame; 
mRecordFormat.mFramesPerPacket = 1; 

3 버퍼가 사용된다.

+0

단일 녹음 세션에 있습니까? 일반적으로 마지막 덩어리는 30000 개 미만입니다. 왜냐하면 그 많은 샘플이 없기 때문입니다. 패킷 수가 30000 미만인 지점에서 녹음을 일시 중지하고 다시 시작 하시겠습니까? 또한'AudioStreamBasicDescription'에서 어떻게 데이터 포맷을 설정 했습니까? – Anurag

+0

일시 중지 또는 중지가 없습니다. 첨부 된 레코드 형식 구성. – alexey

답변

2

편집 : iOS 괴물이 보이고 2 개의 비 파워 버퍼로 제시 될 때 자연스럽게 버퍼 크기가 변경됩니다. (Another SO question이 참조) 어쨌든

30000

(a) 거대한 버퍼 크기

(b) 이상한 번호가 버퍼에 사용할

이다. 보통 64, 즉 64, 128, 256, 512, 1024, 2048, 4096의 2 승 즉 *=2입니다. 4096보다 높게는 보이지 않으며 오디오 작업을 많이합니다.

비정상적으로 큰 버퍼를 사용해야하는 특별한 이유가있는 경우 nextPowerOfTwo 편의 기능을 사용하거나 직접 수학을 하드 코딩 할 수 있습니다.

+0

아마도,하지만 그 이유에 대한 대답은 아닙니다. 버퍼 크기가 2의 거듭 제곱 인 경우 항상 일정합니까? – alexey

+0

@alexey 편집을 참조하십시오. – buildsucceeded

+0

@buildsucceeded - 감사합니다. 당신을 위해 upvote. 내가 작성한 코드 중 일부는 ipad mini 및 시뮬레이터에서 IOs7에서 제대로 작동하지만 왜 iPhone 4에서는 모든 오디오 데이터를 무시했는지 해결하려고했습니다. 버퍼 크기를 떨어 뜨리고 헤이 프레스토. 잘나가는 직장. – unsynchronized