在 Swift 2.0 中创建 CMSampleBuffer 的副本
Create a copy of CMSampleBuffer in Swift 2.0
之前有人问过这个问题,但是 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
。我看过很多例子,它们要么编译但不能工作,要么不编译。
有人看到我做错了什么了吗?
从字面上看,您是在尝试在变量 bufferCopy 初始化之前使用它。
你已经为它声明了一个类型,但还没有分配它指向的内存。
您应该改为使用以下调用创建 CMSampleBuffers https://developer.apple.com/library/tvos/documentation/CoreMedia/Reference/CMSampleBuffer/index.html#//apple_ref/c/func/CMSampleBufferCreate
然后您应该能够将缓冲区复制到其中(只要缓冲区的格式与您从中复制的格式匹配)。
您可以简单地传递一个 CMSampleBuffer?
变量(作为可选的,
用 nil
) 作为 inout 参数隐式初始化
&
:
var bufferCopy : CMSampleBuffer?
let err = CMSampleBufferCreateCopy(kCFAllocatorDefault, buffer, &bufferCopy)
if err == noErr {
// ...
}
之前有人问过这个问题,但是 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
。我看过很多例子,它们要么编译但不能工作,要么不编译。
有人看到我做错了什么了吗?
从字面上看,您是在尝试在变量 bufferCopy 初始化之前使用它。
你已经为它声明了一个类型,但还没有分配它指向的内存。
您应该改为使用以下调用创建 CMSampleBuffers https://developer.apple.com/library/tvos/documentation/CoreMedia/Reference/CMSampleBuffer/index.html#//apple_ref/c/func/CMSampleBufferCreate
然后您应该能够将缓冲区复制到其中(只要缓冲区的格式与您从中复制的格式匹配)。
您可以简单地传递一个 CMSampleBuffer?
变量(作为可选的,
用 nil
) 作为 inout 参数隐式初始化
&
:
var bufferCopy : CMSampleBuffer?
let err = CMSampleBufferCreateCopy(kCFAllocatorDefault, buffer, &bufferCopy)
if err == noErr {
// ...
}