CMSampleBufferSetDataBufferFromAudioBufferList返回错误12731

我试图捕捉应用程序的声音,并将其传递给AVAssetWriter作为input。
我设置audio单元的callback来获得AudioBufferList。
问题开始于将AudioBufferList转换为CMSampleBufferRef。
它始终返回错误-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; } 

编辑:
我检查了bufferList.mBuffers [0] .mData,它不是null,所以可能不是问题。

因为有一个类似的问题没有回答所有的互联网。
我设法解决这个问题,录音完全奏效。
我的问题是错误的parameter passing给CMSampleBufferCreate
numSamples而不是1应该等于numberOfFrames。

所以最后的电话是:

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