8

我正在尝试从数据中创建一个 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.)

请帮我解决这个问题。

4

2 回答 2

4

您应该查看 AVAssetWriterInputPixelBufferAdaptor - 它接受 CVPixelBuffers,因此您无需在 CMSampleBuffer 中转换 CVPixelBuffer。

这是苹果开发论坛上有关它的主题的链接-> https://devforums.apple.com/thread/70258?tstart=0

此外 - 任何机会你可以发布你的项目文件或捕获电影的示例代码 - 我正在使用 AVFoundation 数据输出回调方法中的默认 CMSampleBuffer - 但是当我将它保存到相机胶卷时,除了最后 5 个之外,它都是黑色的我必须手动擦洗到的帧:S

对于我的问题的任何帮助将不胜感激。

干杯,

迈克尔

于 2010-10-03T14:22:47.400 回答
1
    The operation couldn’t be completed. (AVFoundationErrorDomain error -11800.)

对于这个错误,它总是在timingInfo无效时发生。PTS它需要使用和将其设置为有效值Duration

CMSampleTimingInfo timingInfo = kCMTimingInfoInvalid;
timingInfo.presentationTimeStamp = pts; 
timingInfo.duration = duration;
于 2014-04-19T03:54:17.240 回答