CVBuffer和CVImageBuffer

时间:2016-01-16 05:56:51

标签: ios core-video

如果您从Apple查看此文档

https://developer.apple.com/library/tvos/documentation/QuartzCore/Reference/CVBufferRef/index.html#//apple_ref/c/tdef/CVBufferRef

在第二行中,它表示:" CVBuffer对象可以保存视频,音频或某些其他类型的数据。您可以在任何核心视频缓冲区上使用CVBuffer编程接口。"这意味着它也可以保存图像。如果是,那么为什么我们有CVImageBuffer。

我刚刚完成了一些使用AVAssetImageGenerator从视频生成图像的工作。现在我想合并帧来制作视频。我刚刚开始阅读这篇文章。

我目前的状态:
1.现在我知道我需要使用AVAssetWriter 2.然后我需要使用AVAssetWriterInput为它提供输入 我需要使用一些简历和CG课程。

所以如果我们有CVBuffer,请帮助我知道使用CVImageBuffer的原因。我知道CVBuffer是抽象的,但CVImageBuffer并没有从CVBuffer继承。这让我更加生动。

1 个答案:

答案 0 :(得分:1)

CVImageBuffer 继承自CVBuffer,但仅限于“以c为模拟对象方向”。也就是说,如果您知道CVBuffer的类型是某个子类的类型,那么您可以安全地转换为该类型,例如:

if (CFGetTypeID(myCVBuffer) == CVMetalTextureGetTypeID()) {
    CVMetalTextureRef metalBuffer = myCVBuffer;
    // do something with metalBuffer
}

事实上你甚至不需要施放(甚至不是swift!),因为CVBuffer类型都是相同的(typealias es in swift):

typedef CVBufferRef CVImageBufferRef;
typedef CVImageBufferRef CVPixelBufferRef;
typedef CVImageBufferRef CVMetalTextureRef;
// ...

您注意到CVBuffer是一个抽象基类,但您可能错过了CVImageBuffer也是抽象的:它添加了一些涉及图像尺寸和颜色空间的函数,并定义了图像附件键访问图像特定元数据。

我认为您的图片为CGImage,因为您使用的是AVAssetImageGenerator。此时您有两个选择。您可以转换CGImage - > CVPixelBuffer并将其直接附加到您添加到AVAssetWriterInputPixelBufferAdaptor的{​​{1}}。或者,您可以使用AVAssetWriterInput从上面创建的CMSampleBuffer创建CVPixelBuffer,并将其直接附加到CMSampleBufferCreateReadyWithImageBuffer

Some people prefer the pixel buffer adaptor approach但老实说,上述两种方法都令人生畏效率低下(例如,我不认为你可以创建AVAssetWriterInput而不复制{{1} }}}},那么为什么不转储CVPixelBuffer及其不受欢​​迎的CGImage并直接使用AVAssetImageGenerator + CGImage?如果你没有转换*就可以将AVAssetReader附加到你的作者输入中,你将有更好的机会不讨厌你的生活。

*实际上您可能需要更改样本缓冲区的演示时间戳,仍然非常简单: AVAssetReaderOutput