如何将CVPixelBufferGetBaseAddress调用转换为Swift?

5

也许我是第一个在Swift中这样做的人,但似乎网络上没有使用&/inout与uint8_t一起在Swift中进行编程的资料。请问有人可以翻译一下吗?这种关系是否为位运算?

Objective-C

uint8_t *buf=(uint8_t *) CVPixelBufferGetBaseAddress(cvimgRef);

尝试使用Swift

let inout buf:uint8_t = SOMETHING HERE CVPixelBufferGetBaseAddress(cvimgRef)
1个回答

15

CVPixelBufferGetBaseAddress() 返回一个 UnsafeMutablePointer<Void>,可以通过以下方式转换为 UInt8 指针

let buf = UnsafeMutablePointer<UInt8>(CVPixelBufferGetBaseAddress(pixelBuffer))

更新适用于Swift 3(Xcode 8),已核实适用于Swift 5(Xcode 11):

if let baseAddress = CVPixelBufferGetBaseAddress(pixelBuffer) {
    let buf = baseAddress.assumingMemoryBound(to: UInt8.self)
    // `buf` is `UnsafeMutablePointer<UInt8>`
} else {
    // `baseAddress` is `nil`
}

谢谢。我能看出你为什么有14.2k声望值。我将在整个月内发布这样的问题,请关注我!:) 对于let buf,为什么我们不使用像昨天在我的func RGBtoHSV(r: Float, g: Float, b: Float, inout h: Float, inout s: Float, inout v: Float)中向我展示的inout语法? inout只用于函数参数吗? - Edward
@Edward:是的,inout 只用作函数参数的修饰符。 - Martin R
如何将 buf 的 UnsafeMutablePointer<UInt8> 转换为 UInt8 数组?... [UInt8] - omarojo
例如:Array(UnsafeBufferPointer(start: buf, count: ...)) - Martin R
说@MartinR,几年过去了,这种方法怎么样.. let floatBfr = unsafeBitCast(CVPixelBufferGetBaseAddress(pb), to: UnsafeMutablePointer<Float>.self) - Fattie
1
@Fattie:来自https://developer.apple.com/documentation/swift/1641250-unsafebitcast的信息:“不要在类或指针类型中使用unsafeBitCast(_:to :);这样可能会引入未定义的行为。” - Martin R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接