如果您从Apple查看此文档
在第二行中,它表示:" CVBuffer对象可以保存视频,音频或某些其他类型的数据。您可以在任何核心视频缓冲区上使用CVBuffer编程接口。"这意味着它也可以保存图像。如果是,那么为什么我们有CVImageBuffer。
我刚刚完成了一些使用AVAssetImageGenerator从视频生成图像的工作。现在我想合并帧来制作视频。我刚刚开始阅读这篇文章。
我目前的状态:
1.现在我知道我需要使用AVAssetWriter
2.然后我需要使用AVAssetWriterInput为它提供输入
我需要使用一些简历和CG课程。
所以如果我们有CVBuffer,请帮助我知道使用CVImageBuffer的原因。我知道CVBuffer是抽象的,但CVImageBuffer并没有从CVBuffer继承。这让我更加生动。
答案 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