Swift - 如何将CVImageBufferRef转换为CVPixelBufferRef

时间:2014-06-24 15:08:09

标签: swift

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

CMSampleBufferRef sampleBuffer = some value

CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);

我怎样才能在swift中做到这一点?


var pixelBuffer : CVPixelBufferRef = CMSampleBufferGetImageBuffer(sampleBuffer)

给出错误:' Unmanaged< CVPixelBufferRef>'不能兑换为CVPixelBufferRef'


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

给出错误:' CVImageBuffer'不能兑换为CVPixelBufferRef'


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

给出错误:无法转换表达式' CVPixelBufferRef'输入' CVPixelBufferRef'

3 个答案:

答案 0 :(得分:13)

修改

这个答案是在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

特别是这句话

  

重新映射的类型

     

当Swift导入Core Foundation类型时,编译器会重新映射   这些类型的名称。编译器从每个末尾删除Ref   类型名称,因为所有Swift类都是引用类型,因此   后缀是多余的。

     

Core Foundation CFTypeRef类型完全重映射到AnyObject   类型。无论您何时使用CFTypeRef,您现在都应该使用AnyObject   在你的代码中。

您要做的第一件事就是从每种类型中删除“ref”。 但是没有必要,因为“refs”的类型是“非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()返回一个未保留的对象

答案 1 :(得分:5)

在Xcode 6 beta 6中,这最终有效:

var pixelBuffer : CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)

答案 2 :(得分:1)

@ LombaX的解决方案在最新版本Xcode Beta5中对我无效。这里有什么工作:

let imageBuffer : CVImageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)
let srcPtr = Unmanaged.passUnretained(imageBuffer).toOpaque()
let pixelBuffer = Unmanaged<CVPixelBuffer>.fromOpaque(srcPtr).takeUnretainedValue()