2014-12-03 3 views
2

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

Благодарности
KarolCMSampleBufferSetDataBufferFromAudioBufferList возвращающая ошибка 12731

-(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; 
} 


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

ответ

1

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

Таким образом, окончательный вызов:

CMSampleBufferCreate(kCFAllocatorDefault,NULL,false,NULL,NULL,format, 
        (CMItemCount)numberOfFrames, 1, &timing, 0, NULL, &buff); 
+0

Как вы определили свой 'audioUnit'? –