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