gpt4 book ai didi

Swift - 如何将 CVImageBufferRef 转换为 CVPixelBufferRef

转载 作者:搜寻专家 更新时间:2023-10-30 21:49:33 26 4
gpt4 key购买 nike

在 objective-c 中,您可以轻松地将 CVImageBufferRef 转换为 CVPixelBufferRef:

CMSampleBufferRef sampleBuffer = some value

CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);

我怎样才能快速做到这一点?


var pixelBuffer : CVPixelBufferRef = CMSampleBufferGetImageBuffer(sampleBuffer)

给出错误:“Unmanaged ”不可转换为“CVPixelBufferRef”


var pixelBuffer : CVPixelBufferRef = CMSampleBufferGetImageBuffer(sampleBuffer).takeRetainedValue()

给出错误:“CVImageBuffer”不可转换为“CVPixelBufferRef”


var pixelBuffer : CVPixelBufferRef = CMSampleBufferGetImageBuffer(sampleBuffer).takeRetainedValue() as CVPixelBufferRef

给出错误:无法将表达式的类型“CVPixelBufferRef”转换为类型“CVPixelBufferRef”

最佳答案

编辑

这个答案是在 Swift beta 测试期间给出的。看起来现在解决方案更简单了,正如 klinger 所建议的那样

var pixelBuffer : CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)

但是由于历史原因我会保留之前的答案:-)

上一个答案

查看预发布文档:

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html#//apple_ref/doc/uid/TP40014216-CH6-XID_40

特别是这个声明

Remapped Types

When Swift imports Core Foundation types, the compiler remaps the names of these types. The compiler removes Ref from the end of each type name because all Swift classes are reference types, therefore the suffix is redundant.

The Core Foundation CFTypeRef type completely remaps to the AnyObject type. Wherever you would use CFTypeRef, you should now use AnyObject in your code.

您要做的第一件事是从每种类型中删除“ref”。然而,这不是必需的,因为“refs”被类型化为“non-ref”类型。

那么,这个语句应该有效。在我从未使用过 CMSampleBufferGetImageBuffer 之前,它可能需要一些调整,因此我不确定第一行(初始化缓冲区)

    var buf : CMSampleBuffer = // initialize the buffer
var anUnmanaged : Unmanaged<CVImageBuffer> = CMSampleBufferGetImageBuffer(buf)
var returnValue = anUnmanaged.takeUnretainedValue()

或者,不久

    var buf : CMSampleBuffer = // initialize the buffer
var anUnmanaged : CVImageBuffer = CMSampleBufferGetImageBuffer(buf).takeRetainedValue()

但是,您要求使用 CVPixelBuffer。如果这两种类型完全兼容(我不知道底层 API,所以我假设 objc 中的 CVPixelBuffer 和 CVImageBuffer 之间的转换总是安全的),没有“自动”去做,你必须通过一个不安全的指针.

完整的代码是这样的:

    var buf : CMSampleBuffer = // initialize the buffer
var anUnmanaged : Unmanaged<CVImageBuffer> = CMSampleBufferGetImageBuffer(buf)
var returnValue = anUnmanaged.takeUnretainedValue()

var anOpaque = anUnmanaged.toOpaque()
var pixelBuffer : CVPixelBuffer = Unmanaged<CVPixelBuffer>.fromOpaque(anOpaque).takeUnretainedValue()

我使用了不消耗保留计数的 takeUnretainedValue(),因为 CMSampleBufferGetImageBuffer() 返回一个未保留的对象

关于Swift - 如何将 CVImageBufferRef 转换为 CVPixelBufferRef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24390190/

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