CVBuffer 和 CVImageBuffer 之间的关系是什么

what is the relation between CVBuffer and CVImageBuffer

如果您从 apple 查看此文档

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

在第二行,它说:"A CVBuffer object can hold video, audio, or possibly some other type of data. You can use the CVBuffer programming interface on any Core Video buffer."这意味着它也可以保存图像。如果是,那为什么我们有 CVImageBuffer.

我刚刚完成了一些使用 AVAssetImageGenerator.Now 从视频生成图像的工作我想合并帧以制作 video.SO,我刚刚开始阅读这方面的内容。

我目前的状态:
1.Well 现在我知道我需要使用 AVAssetWriter。
2.Then 我需要使用 AVAssetWriterInput 为其提供输入。
3.I 需要使用一些 CV 和 CG 类。

所以请帮助我知道使用 CVImageBuffer 的原因,如果我们 CVBuffer.I 知道 CVBuffer 是抽象的,但 CVImageBuffer 不继承自 CVBuffer.This 更让我迷惑。

CVImageBuffer 继承自 CVBuffer,但仅限于 "simulated object orientation in c" 方式。也就是说,如果您知道 CVBuffer 的类型是某个子 class 的类型,那么您可以安全地转换为该类型,例如:

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

事实上你甚至不需要强制转换(甚至在 swift 中也不需要!),因为 CVBuffer 类型都是相同的(typealiases in swift):

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

您注意到 CVBuffer 是一个抽象基础 class,但您可能没有注意到 CVImageBuffer 也是抽象的:它添加了一些涉及图像维度和颜色空间的函数并定义用于访问图像特定元数据的图像附件密钥。

我假设您的图片是 CGImage,因为您使用的是 AVAssetImageGenerator。此时你有两个选择。您可以转换 CGImage -> CVPixelBuffer 并将其直接附加到您添加到 AVAssetWriterInputAVAssetWriterInputPixelBufferAdaptor。或者您可以使用 CMSampleBufferCreateReadyWithImageBuffer 从上面创建的 CVPixelBuffer 创建一个 CMSampleBuffer 并将其直接附加到您的 AVAssetWriterInput.

Some people prefer the pixel buffer adaptor approach,但老实说,上述两种方法都令人望而生畏 效率低下(例如,我不认为你可以创建 CVPixelBuffer 没有复制 CGImage 像素),那么为什么不转储 AVAssetImageGenerator 及其不受欢​​迎的 CGImage 并直接使用 AVAssetReader + AVAssetReaderOutput?它会提供 CMSampleBuffers,您可以在不转换的情况下*将其附加到您的作者输入中,并且您将有更好的机会不讨厌自己的生活。

* 实际上你可能需要更改样本缓冲区的显示时间戳,仍然很简单: CMSampleBufferCreateCopyWithNewTiming