【问题标题】:Create a copy of CMSampleBuffer in Swift 2.0在 Swift 2.0 中创建 CMSampleBuffer 的副本
【发布时间】:2016-05-29 19:33:48
【问题描述】:

以前有人问过这个问题,但是自从被问到之后,Swift 中肯定发生了一些变化。我正在尝试存储从AVCaptureSession 返回的CMSampleBuffer 对象,以便稍后处理。经过一些实验,我发现AVCaptureSession 必须重用它的CMSampleBuffer 引用。当我尝试保持超过 15 个时,会话挂起。所以我想我会复制样本缓冲区。但我似乎无法让它工作。这是我写的:

var allocator: Unmanaged<CFAllocator>! = CFAllocatorGetDefault()
var bufferCopy: UnsafeMutablePointer<CMSampleBuffer?>
let err = CMSampleBufferCreateCopy(allocator.takeRetainedValue(), sampleBuffer, bufferCopy)
if err == noErr {
    bufferArray.append(bufferCopy.memory!)
} else {
    NSLog("Failed to copy buffer. Error: \(err)")
}

这不会编译,因为它说Variable 'bufferCopy' used before being initialized。我查看了很多示例,它们要么编译但不工作,要么无法编译。

有人看到我在这里做错了吗?

【问题讨论】:

    标签: ios swift2 avfoundation unsafe-pointers core-media


    【解决方案1】:

    实际上,您是在初始化变量 bufferCopy 之前尝试使用它。

    你已经为它声明了一个类型,但是还没有分配它指向的内存。

    您应该改为使用以下调用 https://developer.apple.com/library/tvos/documentation/CoreMedia/Reference/CMSampleBuffer/index.html#//apple_ref/c/func/CMSampleBufferCreate 创建 CMSampleBuffers

    然后您应该能够将缓冲区复制到其中(只要缓冲区的格式与您要复制的格式匹配)。

    【讨论】:

    • 感谢蒂姆的回复,这似乎是一个很好的深度克隆解决方案。但是我对在这个级别使用内存的方式并不熟悉。你知道我在哪里可以找到一个很好的例子来说明如何为视频和音频创建一个CMSampleBuffer 的深层克隆吗? Apple 显然拥有 15 个CMSampleBuffers 的缓存,它在运行AVCaptureSession 时会回收这些缓存。我显然需要深度克隆来存储我自己的。
    • 我终于想出了如何使用它来创建深度克隆。所有的复制方法都重用了堆中的数据,这些数据会锁定AVCaptureSession。所以我不得不将数据提取到NSMutableData 对象中,然后创建一个新的样本缓冲区。谢谢
    • @Rob 您能否添加您的代码以进行深度克隆。我也有同样的问题,已经找了半天了。
    • @Rob,您的确切程序已在后续问题中询问:stackoverflow.com/questions/38335365 也许您想在那里发布答案?
    • @Rob,你能分享一下你的解决方案吗
    【解决方案2】:

    您可以简单地传递一个CMSampleBuffer? 变量(作为可选的, 使用nil) 隐式初始化为 inout 参数 &amp;:

    var bufferCopy : CMSampleBuffer?
    let err = CMSampleBufferCreateCopy(kCFAllocatorDefault, buffer, &bufferCopy)
    if err == noErr {
        // ...
    }
    

    【讨论】:

    • 谢谢。这回答了我上面关于编译代码的问题。当我测试运行代码时,结果证明它一定是一个浅克隆。新的CMSampleBuffer 持有的数据与之前的位置相同。因此,当我运行AVCaptureSession 时,它发送了 15 个样本并再次锁定,因为我持有对基础数据位置的引用。知道如何创建深度克隆,以便将数据复制到内存中的新位置吗?谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-11-15
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    相关资源
    最近更新 更多