2014-06-24 18 views
6

Trong Objective-C, bạn có thể dễ dàng bỏ CVImageBufferRef như một CVPixelBufferRef:Swift - Làm thế nào để bạn cast một CVImageBufferRef như một CVPixelBufferRef

CMSampleBufferRef sampleBuffer = some value 

CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 

Làm thế nào tôi có thể làm điều này trong nhanh chóng?


var pixelBuffer : CVPixelBufferRef = CMSampleBufferGetImageBuffer(sampleBuffer) 

cung cấp cho các lỗi: 'Switch <CVPixelBufferRef>' không phải là chuyển đổi thành 'CVPixelBufferRef'


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

cung cấp cho các lỗi: 'CVImageBuffer' không phải là chuyển đổi thành 'CVPixelBufferRef '


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

cung cấp cho các lỗi: Không thể chuyển đổi của biểu gõ 'CVPixelBufferRef' gõ 'CVPixelBufferRef'

Trả lời

11

EDIT

Câu trả lời này đã được đưa ra trong giai đoạn thử nghiệm beta Swift. Dường như bây giờ là giải pháp đơn giản hơn, theo đề nghị của Klinger

var pixelBuffer : CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) 

Tuy nhiên, tôi sẽ rời khỏi câu trả lời trước vì lý do historycal :-)

câu trả lời trước

Nhìn vào prerelease tài liệu:

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

Cụ thể tuyên bố này

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.

Điều đầu tiên bạn muốn làm là xóa "ref" khỏi mỗi loại. Tuy nhiên nó không cần thiết, vì "refs" được đánh máy với các loại "non-ref".

Sau đó, tuyên bố này sẽ hoạt động. Nó có thể cần một số điều chỉnh trước khi tôi chưa bao giờ làm việc với CMSampleBufferGetImageBuffer, và vì lý do này tôi không chắc chắn về những dòng đầu tiên (khởi tạo bộ đệm)

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

Hoặc, ngay

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

Tuy nhiên , bạn đã yêu cầu một CVPixelBuffer. Nếu hai loại này hoàn toàn tương thích (tôi không biết API cơ bản vì vậy tôi giả định rằng việc truyền giữa CVPixelBuffer và CVImageBuffer trong objc luôn an toàn), không có "tự động" để thực hiện, bạn phải vượt qua một Unsafe Con trỏ.

Các mã hoàn chỉnh là thế này:

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() 

tôi đã sử dụng takeUnretainedValue() mà không tiêu thụ một số giữ lại, vì CMSampleBufferGetImageBuffer() trả về một đối tượng unretained

+0

Cảm ơn bạn! Trong CVImageBufferRef khách quan-c là một từ đồng nghĩa cho một CVPixelBufferRef, do đó, điều này đã khiến tôi phát điên. – klinger

+0

Trong trường hợp này, tôi đề nghị bạn gửi một yêu cầu tính năng lỗi để có một diễn viên tự động trong một phiên bản tương lai :-) Tôi không loại trừ rằng có một số chức năng để cầu nối giữa hai loại ẩn ở đâu đó, tuy nhiên đi qua một mờ con trỏ là giải pháp đầu tiên đến với tâm trí của tôi :-) – LombaX

1

@ giải pháp LombaX đã không làm việc cho tôi trong bản dựng mới nhất, Xcode Beta5. Đây là những gì đã làm công việc:

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

Trong Xcode 6 beta 6 cuối cùng này hoạt động:

var pixelBuffer : CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)

Các vấn đề liên quan