首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift 3:如何访问48字节matrix_float3x3中的CFData值?

Swift 3:如何访问48字节matrix_float3x3中的CFData值?
EN

Stack Overflow用户
提问于 2018-02-01 14:37:58
回答 3查看 1.9K关注 0票数 5

我试图访问这个回答之后的内在矩阵。

通过运行下面的推荐,我获得了一个48字节的AnyObject,并进一步将其转换为CFData

代码语言:javascript
复制
let camData = CMGetAttachment(sampleBuffer, kCMSampleBufferAttachmentKey_CameraIntrinsicMatrix, nil)

但是,我检查了sampleBuffer在CMSampleBuffer.h中的输出。

代码语言:javascript
复制
/*! @constant   kCMSampleBufferAttachmentKey_CameraIntrinsicMatrix
     @abstract  Indicates the 3x3 camera intrinsic matrix applied to the current sample buffer.
     @discussion Camera intrinsic matrix is a CFData containing a matrix_float3x3, which is column-major.
        ....
 */
CM_EXPORT const CFStringRef kCMSampleBufferAttachmentKey_CameraIntrinsicMatrix  // CFData (matrix_float3x3) __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_11_0);

如何从matrix_float3x3访问CFData中的值

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-02-01 14:54:47

这应该是可行的:

  • 使用从CFDataNSDataData的桥接,以及
  • 获取指向数据字节的所需类型指针的withUnsafeBytes方法,
  • .pointee以取消指针的引用。

示例:

代码语言:javascript
复制
if let camData = CMGetAttachment(sampleBuffer, kCMSampleBufferAttachmentKey_CameraIntrinsicMatrix, nil) as? Data {
    let matrix: matrix_float3x3 = camData.withUnsafeBytes { $0.pointee }

    // ...

}

从上下文推断指针类型(闭包中的$0)为UnsafePointer<matrix_float3x3>

票数 3
EN

Stack Overflow用户

发布于 2022-08-26 03:49:50

以下是马丁·R( Martin )的回答的更新,因为withUnsafeBytes已经被否决了:

代码语言:javascript
复制
if let camData = CMGetAttachment(sampleBuffer, 
                                 key: kCMSampleBufferAttachmentKey_CameraIntrinsicMatrix, 
                                 attachmentModeOut: nil) as? Data {
    let matrix = camData.withUnsafeBytes { $0.load(as: matrix_float3x3.self) }
    ...
}
票数 1
EN

Stack Overflow用户

发布于 2019-10-03 20:37:22

这是Martin R对目标-c的回答的版本:

代码语言:javascript
复制
CFTypeRef cameraIntrinsicData = CMGetAttachment(sampleBuffer, kCMSampleBufferAttachmentKey_CameraIntrinsicMatrix, nil);
if(cameraIntrinsicData != nil){
    CFDataRef cfdr = (CFDataRef)(cameraIntrinsicData);
    matrix_float3x3 camMatrix = (matrix_float3x3 *)(CFDataGetBytePtr(cfdr));
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48565286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档