编辑
这个答案是在 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”被类型化为“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 之间的转换总是安全的),没有“自动化”来做到这一点,你必须通过一个 Unsafe Pointer .
完整的代码是这样的:
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() 返回一个未保留的对象