2014-06-24 37 views
6

在Objective-C,你可以輕鬆地投了CVImageBufferRef作爲CVPixelBufferRef:斯威夫特 - 你怎麼投了CVImageBufferRef作爲CVPixelBufferRef

CMSampleBufferRef sampleBuffer = some value 

CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 

我怎樣才能做到這一點迅速?


var pixelBuffer : CVPixelBufferRef = CMSampleBufferGetImageBuffer(sampleBuffer) 

給出了錯誤: '非託管<CVPixelBufferRef>' 是無法轉換爲 'CVPixelBufferRef'


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

給出了錯誤: 'CVImageBuffer' 是無法轉換爲「CVPixelBufferRef '


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

給出了錯誤:無法轉換表達式的類型「CVPixelBufferRef爲鍵入「CVPixelBufferRef」

回答

11

編輯

期間斯威夫特beta測試期間給出這個答案。看來,現在的解決方案是簡單的,由克林格

var pixelBuffer : CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) 

的建議,但是我會在搶鮮離開historycal原因,以前的答案:-)

以前的答案

看文檔:

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之間的轉換總是安全的),沒有「自動化」來做到這一點,你必須通過一個Unsafe指針。

完整的代碼是這樣的:

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()返回一個不保留對象

+0

謝謝!在Objective-C中,CVImageBufferRef是CVPixelBufferRef的同義詞,所以這讓我發瘋。 – klinger

+0

在這種情況下,我建議你提交一個bug特性請求,以便在將來的版本中進行自動轉換:-)我不排除有某種函數可以在隱藏在某處的兩種類型之間進行橋接,但是通過一個不透明的指針是我想到的第一個解決方案:-) – LombaX

1

@ LombaX的解決方案沒有奏效對於我最新的版本,Xcode Beta5。下面是做了工作:

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

在Xcode中6測試版6這最後的工作原理:

var pixelBuffer : CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)