Ответы здесь не являются общими.Вызов CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer
может произойти сбой, когда AudioBufferList
должен иметь другой размер.Если в качестве примера используются сэмплы без перемежения.
Правильный способ - вызвать CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer
дважды.Первый вызов запрашивает размер, необходимый для AudioBufferList
, а второй фактически заполняет AudioBufferList
.
size_t bufferSize = 0;
CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(
sampleBuffer,
&bufferSize,
NULL,
0,
NULL,
NULL,
0,
NULL
);
AudioBufferList *bufferList = malloc(bufferSize);
CMBlockBufferRef blockBuffer = NULL;
CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(
sampleBuffer,
NULL,
bufferList,
bufferSize,
NULL,
NULL,
kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment,
&blockBuffer
);
// handle audio here
free(bufferList);
CFRelease(blockBuffer);
В реальном примере вы должны выполнить обработку ошибок, а также вы не должны неправильно распределять каждый кадрвместо этого кешируйте AudioBufferList
.