CMSampleBufferSetDataBufferFromAudioBufferList возвращает ошибку 12731

Я пытаюсь захватить звук приложения и передать его AVAssetWriter в качестве входных данных.
Я устанавливаю обратный вызов для аудиоустройства, чтобы получить AudioBufferList.
Проблема начинается с преобразования AudioBufferList в CMSampleBufferRef.
Всегда возвращается ошибка -12731, которая указывает на отсутствие обязательного параметра

Спасибо
Karol

-(OSStatus) recordingCallbackWithRef:(void*)inRefCon
                            flags:(AudioUnitRenderActionFlags*)flags
                        timeStamp:(const AudioTimeStamp*)timeStamp
                        busNumber:(UInt32)busNumber
                     framesNumber:(UInt32)numberOfFrames
                             data:(AudioBufferList*)data
{

AudioBufferList bufferList;
bufferList.mNumberBuffers = 1;
bufferList.mBuffers[0].mData = NULL;

OSStatus status;

status = AudioUnitRender(audioUnit,
                         flags,
                         timeStamp,
                         busNumber,
                         numberOfFrames,
                         &bufferList);
[self checkOSStatus:status];

AudioStreamBasicDescription audioFormat;
// Describe format
audioFormat.mSampleRate         = 44100.00;
audioFormat.mFormatID           = kAudioFormatLinearPCM;
audioFormat.mFormatFlags        = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
audioFormat.mFramesPerPacket    = 1;
audioFormat.mChannelsPerFrame   = 1;
audioFormat.mBitsPerChannel     = 16;
audioFormat.mBytesPerPacket     = 2;
audioFormat.mBytesPerFrame      = 2;

CMSampleBufferRef buff = NULL;
CMFormatDescriptionRef format = NULL;
CMSampleTimingInfo timing = { CMTimeMake(1, 44100), kCMTimeZero, kCMTimeInvalid };

status = CMAudioFormatDescriptionCreate(kCFAllocatorDefault, &audioFormat, 0, NULL, 0, NULL, NULL, &format);
[self checkOSStatus:status];

status = CMSampleBufferCreate(kCFAllocatorDefault,NULL,false,NULL,NULL,format,1, 1, &timing, 0, NULL, &buff);
[self checkOSStatus:status];

status = CMSampleBufferSetDataBufferFromAudioBufferList(buff, 
                                                        kCFAllocatorDefault, 
                                                        kCFAllocatorDefault, 
                                                        0, 
                                                        &bufferList);

[self checkOSStatus:status]; //Status here is 12731

//Do something with the buffer

return noErr;
}


Редактировать:
Я проверил bufferList.mBuffers[0].mData, и он не нулевой, так что, вероятно, это не проблема.

1 ответ

Решение

Так как во всем Интернете есть аналогичный вопрос без ответа.
Мне удалось это решить, и запись полностью работает.
Моя проблема была неправильным параметром, переданным CMSampleBufferCreate,
numSamples вместо 1 должен быть равен numberOfFrames.

Итак, последний звонок:

CMSampleBufferCreate(kCFAllocatorDefault,NULL,false,NULL,NULL,format,
                    (CMItemCount)numberOfFrames, 1, &timing, 0, NULL, &buff);
Другие вопросы по тегам