开发者

Creating CMSampleBufferRef from the data

开发者 https://www.devze.com 2023-01-17 06:12 出处:网络
I am trying to create a CMSampleBuffer Ref from the data and trying to feed it to AVAssetWriter. But as开发者_开发知识库set writer is failing to create the movie from the data. Following is the code

I am trying to create a CMSampleBuffer Ref from the data and trying to feed it to AVAssetWriter. But as开发者_开发知识库set writer is failing to create the movie from the data. Following is the code to create the CMSampleBufferRef.

CVImageBufferRef cvimgRef = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(cvimgRef,0);

uint8_t *buf=(uint8_t *)CVPixelBufferGetBaseAddress(cvimgRef);

int width = 480;
int height = 360;
int bitmapBytesPerRow   = width*4;
int bitmapByteCount     = bitmapBytesPerRow*height;


CVPixelBufferRef pixelBufRef = NULL;
CMSampleBufferRef newSampleBuffer = NULL;
CMSampleTimingInfo timimgInfo = kCMTimingInfoInvalid;
CMSampleBufferGetSampleTimingInfo(sampleBuffer, 0, &timimgInfo);

OSStatus result = 0;

OSType pixFmt = CVPixelBufferGetPixelFormatType(cvimgRef);

CVPixelBufferCreateWithBytes(kCFAllocatorDefault, width, height, pixFmt, buf, bitmapBytesPerRow, NULL, NULL, NULL, &pixelBufRef);

CMVideoFormatDescriptionRef videoInfo = NULL;

result = CMVideoFormatDescriptionCreateForImageBuffer(NULL, pixelBufRef, &videoInfo);

CMSampleBufferCreateForImageBuffer(kCFAllocatorDefault, pixelBufRef, true, NULL, NULL, videoInfo, &timimgInfo, &newSampleBuffer);

Movie creation works fine when we use the original CMSampleBufferRef obtained from the AVFoundation data output callback method.

But the same fails when I try to create the movie using the custom CMSampleBufferRef. Asset writer throws the following error:

The operation couldn’t be completed. (AVFoundationErrorDomain error -11800.)

Please help me out in resolving this issue.


You should look into AVAssetWriterInputPixelBufferAdaptor - it accepts CVPixelBuffers so you don't need to convert the CVPixelBuffer in a CMSampleBuffer.

here is a link to a thread about it on the apple dev forum -> https://devforums.apple.com/thread/70258?tstart=0

Also - any chance you could post your project file or sample code of the capture movie working -- I am using the default CMSampleBuffer from the AVFoundation data output callback method - but when I save it to camera roll it is all black except the last 5 frames which I have to manually scrub to :S

any help in regards to my issue would be greatly appreciated.

Cheers,

Michael


    The operation couldn’t be completed. (AVFoundationErrorDomain error -11800.)

For this error, it always occur when timingInfo is invalid. it need set it to valid values with PTS and Duration.

CMSampleTimingInfo timingInfo = kCMTimingInfoInvalid;
timingInfo.presentationTimeStamp = pts; 
timingInfo.duration = duration;
0

精彩评论

暂无评论...
验证码 换一张
取 消