iOS, Audio Queue: размер буфера не является постоянным - PullRequest
2 голосов
/ 12 июня 2011

Я использую Audio Queue Services в своем приложении. При выделении буфера я установил размер буфера в 30000 сэмплов:

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

Но последующие вызовы обратного вызова выполняются со следующими inNumberPacketDescription :

30000
30000
30000
26928
30000
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 используются буферы.

1 Ответ

3 голосов
/ 12 сентября 2011

Редактировать: Я видел, как iOS взбесилась и самопроизвольно изменила размеры буфера, когда была представлена ​​аудио-буфера не-степени двух. ( Другой SO вопрос ссылается на это) В любом случае,

30000

(a) ОГРОМНЫЙ размер буфера и

(б) странное число, которое нужно использовать для буфера. Обычно они имеют степень 2 - то есть *=2 от 64, то есть 64, 128, 256, 512, 1024, 2048, 4096. Я никогда не видел один выше 4096, и я много работаю со звуком.

Если у вас есть особая причина использовать необычно большие буферы, вы можете использовать вспомогательную функцию nextPowerOfTwo или просто жестко закодировать математику самостоятельно.

...