在Swift 2.0中创建CMSampleBuffer的副本

时间:2016-02-17 21:11:55

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

以前曾经问过这个问题,但是自从被问到以后,Swift的内容一定有所改变。我正在尝试存储从CMSampleBuffer返回的AVCaptureSession个对象,以便稍后处理。经过一些实验,我发现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。我看了很多例子,他们要么编译也不要工作,否则他们不会编译。

任何人都能看到我在这里做错了什么?

2 个答案:

答案 0 :(得分:7)

您可以简单地传递CMSampleBuffer?变量(作为可选项, 使用nil}隐式初始化为inout参数 &

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

答案 1 :(得分:2)

字面意思是你在初始化之前尝试使用变量bufferCopy。

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

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

创建CMSampleBuffers

您应该可以将缓冲区复制到此处(只要缓冲区的格式与您要复制的格式匹配)。