我正在使用
问题是,当我尝试将videoData保存到数组中时,我会遇到OutOfBuffers错误。如果我尝试保存videoData/相关联的图像/与此数据相关的任何内容,这个问题就会持续存在。
所以,我认为正在发生的是,由于将任何相关数据保存到数组中,它将保留内存中缓冲区中的数据,而通常会释放它。 早先链接的OutOfBuffers网页指出,我可以:
如果需要对捕获的数据执行扩展处理,请将该数据复制到您管理其寿命的缓冲区中,而不是依赖于由捕获输出供应的缓冲区。
我尝试创建一个新的
但这会导致相同的问题--视频数据仍然停留在缓冲区中。我大约获得了5-6组视频数据,然后就没有了更多数据。
AVCaptureDataOutputSynchronizerDelegate
来处理视频、深度和元数据的捕获数据。 private let videoDataOutput = AVCaptureVideoDataOutput()
private let depthDataOutput = AVCaptureDepthDataOutput()
private let metadataOutput = AVCaptureMetadataOutput()
所以使用下面的代码,我能够从AVCaptureDataOutputSynchronizerDelegate
方法中获取特定的视频数据。
func dataOutputSynchronizer(_ synchronizer: AVCaptureDataOutputSynchronizer, didOutput synchronizedDataCollection: AVCaptureSynchronizedDataCollection) {
guard let syncedVideoData = synchronizedDataCollection.synchronizedData(for: self.videoDataOutput) as? AVCaptureSynchronizedSampleBufferData else { return }
问题是,当我尝试将videoData保存到数组中时,我会遇到OutOfBuffers错误。如果我尝试保存videoData/相关联的图像/与此数据相关的任何内容,这个问题就会持续存在。
let array:[CMSampleBuffer] = []
...
array.append(syncedVideoData)
//Gets to about 5-6 sets of data, then it runs out of buffers.
//I think the buffer is being retained permanently since I am saving to a global variable here.
//Leading to out of buffer error
所以,我认为正在发生的是,由于将任何相关数据保存到数组中,它将保留内存中缓冲区中的数据,而通常会释放它。 早先链接的OutOfBuffers网页指出,我可以:
如果需要对捕获的数据执行扩展处理,请将该数据复制到您管理其寿命的缓冲区中,而不是依赖于由捕获输出供应的缓冲区。
我尝试创建一个新的
CMSampleBuffer
。extension VideoCapture: AVCaptureDataOutputSynchronizerDelegate {
func dataOutputSynchronizer(_ synchronizer: AVCaptureDataOutputSynchronizer, didOutput synchronizedDataCollection: AVCaptureSynchronizedDataCollection) {
var newData:CMSampleBuffer?
guard let syncedVideoData = synchronizedDataCollection.synchronizedData(for: self.videoDataOutput) as? AVCaptureSynchronizedSampleBufferData else { return }
guard !syncedVideoData.sampleBufferWasDropped else {
print(syncedVideoData.droppedReason.rawValue)
return
}
let videoSampleBuffer = syncedVideoData.sampleBuffer
CMSampleBufferCreateCopy(allocator: kCFAllocatorDefault, sampleBuffer: videoSampleBuffer, sampleBufferOut: &newData)
if(newData != nil) {
self.buffer.append(newData!)
}
}
但这会导致相同的问题--视频数据仍然停留在缓冲区中。我大约获得了5-6组视频数据,然后就没有了更多数据。
如何"将该数据复制到您管理生命周期的缓冲区中,而不是依赖于由捕获输出供应的缓冲区",有什么指导意见吗?就像outOfBuffers网站上所示的那样?