我正在尝试从数据创建CMSampleBuffer Ref并尝试将其提供给AVAssetWriter。 但资产作家未能从数据中创建电影。以下是创建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);
当我们使用从AVFoundation数据输出回调方法获得的原始CMSampleBufferRef时,电影创建工作正常。
但是当我尝试使用自定义CMSampleBufferRef创建影片时,同样失败了。资产编写器抛出以下错误:
The operation couldn’t be completed. (AVFoundationErrorDomain error -11800.)
请帮我解决这个问题。
答案 0 :(得分:4)
你应该研究AVAssetWriterInputPixelBufferAdaptor - 它接受CVPixelBuffers,所以你不需要在CMSampleBuffer中转换CVPixelBuffer。
这是在apple dev论坛上关于它的一个帖子的链接 - > https://devforums.apple.com/thread/70258?tstart=0
此外 - 您可以发布项目文件或捕获影片的示例代码工作的任何机会 - 我正在使用AVFoundation数据输出回调方法中的默认CMSampleBuffer - 但是当我将其保存到相机胶卷时它除了全黑外我必须手动擦除的最后5帧:S
对我的问题的任何帮助将不胜感激。
干杯,
迈克尔
答案 1 :(得分:1)
The operation couldn’t be completed. (AVFoundationErrorDomain error -11800.)
对于此错误,它始终在timingInfo
无效时发生。需要将其设置为PTS
和Duration
的有效值。
CMSampleTimingInfo timingInfo = kCMTimingInfoInvalid;
timingInfo.presentationTimeStamp = pts;
timingInfo.duration = duration;