gpt4 book ai didi

ios - CVBuffer 和 CVImageBuffer 之间的关系是什么

转载 作者:行者123 更新时间:2023-11-29 12:06:26 33 4
gpt4 key购买 nike

如果你从 apple 查看这个文档

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

就在第二行,它说:“CVBuffer 对象可以保存视频、音频或可能的其他类型的数据。您可以在任何 Core Video 缓冲区上使用 CVBuffer 编程接口(interface)。”这意味着它也可以保存图像。如果是,那我们为什么要有 CVImageBuffer。

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

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

因此,如果我们有 CVBuffer,请帮助我了解使用 CVImageBuffer 的原因。我知道 CVBuffer 是抽象的,但 CVImageBuffer 并没有继承自 CVBuffer。这让我更加困惑。

最佳答案

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

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

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

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

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

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

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

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

关于ios - CVBuffer 和 CVImageBuffer 之间的关系是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34824023/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com