美文网首页
iOS Swift 将UnsafeMutableRawPoint

iOS Swift 将UnsafeMutableRawPoint

作者: Accepted_ | 来源:发表于2020-11-07 20:36 被阅读0次

获取视频流(CMSampleBufferRef)sampleBuffer的地址,并将其转为uint8_t/UInt8格式,Objective-C实现方式如下:

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
    //获取buffer
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
    //获取buffer地址并强转
    uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(imageBuffer);
}

但Swift直接这样写:

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
        
    let imageBuffer: CVImageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)!
    let baseAddress: UInt8 = CVPixelBufferGetBaseAddress(imageBuffer)! as UInt8
}

编译会报错:

Cannot convert value of type 'UnsafeMutableRawPointer' to type 'UInt8' in coercion

需要多转一步才可以:

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
        
        let imageBuffer: CVImageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)!
        
        let tempPointer: UnsafeMutableRawPointer = CVPixelBufferGetBaseAddress(imageBuffer)!
        let opaquePtr = OpaquePointer(tempPointer)
        let baseAddress = UnsafeMutablePointer<UInt8>(opaquePtr)
}

以下资料参考# 在 Swift 里使用指针

Swift 一共有 8 种指针类型。基础是不可变指针 UnsafePointer,对应的会有可变指针 UnsafeMutablePointer。另外还有可以塞数组的 Buffer 指针和完全不知道是什么内容的 Raw 指针,也即没有指定泛型。

四种带类型指针:
UnsafeMutablePointer
UnsafePointer
UnsafeMutableBufferPointer
UnsafeBufferPointer

四种不带类型的 RawPointer:
UnsafeMutableRawPointer
UnsafeRawPointer
UnsafeMutableRawBufferPointer
UnsafeRawBufferPointer

*Apple Developer 文档里有 C 指针和 Swift 指针的对应表:

C Syntax Swift Syntax
const Type * UnsafePointer
Type * UnsafeMutablePointer
Type * const * UnsafePointer
Type * __strong * UnsafeMutablePointer
Type ** AutoreleasingUnsafeMutablePointer
const void * UnsafeRawPointer
void * UnsafeMutableRawPointer
从CoreVideo框架头文件可看出, Objective-C返回值 Swift返回值
CVPixelBufferGetBaseAddress返回值为void *,对应Swift为UnsafeMutableRawPointer,而UnsafeMutableRawPointer不带任何类型,必须为它指一个类型,就要用到OpaquePointer

相关文章

网友评论

      本文标题:iOS Swift 将UnsafeMutableRawPoint

      本文链接:https://www.haomeiwen.com/subject/yhfjuktx.html