5

之前有人问过这个问题,但自从有人问到这个问题后,Swift 中肯定发生了一些变化。我正在尝试存储CMSampleBuffer从 an 返回的对象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. 我查看了许多示例,它们要么编译但不工作,要么无法编译。

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

4

2 回答 2

8

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

var bufferCopy : CMSampleBuffer?
let err = CMSampleBufferCreateCopy(kCFAllocatorDefault, buffer, &bufferCopy)
if err == noErr {
    // ...
}
于 2016-02-18T07:51:12.837 回答
2

从字面上看,您正在尝试在初始化之前使用变量 bufferCopy。

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

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

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

于 2016-02-17T22:51:00.083 回答