在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'
答案 0 :(得分:13)
修改强>
这个答案是在Swift beta测试期间给出的。现在似乎现在解决方案更简单了,正如klinger
所建议的那样var pixelBuffer : CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)
但是出于历史原因,我会留下以前的答案: - )
以前的答案
查看预发布文档:
特别是这句话
重新映射的类型
当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()