我修改了这个Apple示例代码AVcam,我想做的是将最新的20个CMSampleBuffer存储到一个数组中。
我在
AVCaptureVideoDataOutputSampleBufferDelegate
中添加一个 CameraViewController
协议,创建一个新的 VideoDataOutput
并连接它。然后将委托设置为 self。
在回调函数中
var bufferArray:[CMSampleBuffer] = []
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
if bufferArray.count > 20{
bufferArray.removeFirst()
}
bufferArray.append(sampleBuffer)
}
但是调用它5-10次后(基于会话的预设),它就不会再调用它了。在我的另一个相机应用程序中,预览也卡住了。
奇怪的是,如果我只持有缓冲区的一个引用,就像将代码更改为
singlebuffer = sampleBuffer
,一切正常。我更改了许多捕获设置,但没有一个起作用。
更新: 在diddrop回调函数中,显示了原因
DroppedFrameReason(P) = OutOfBuffers
,苹果文档是这样说的:
提供样本缓冲区的模块已用完源缓冲区。这种情况通常是由于客户端持有缓冲区时间过长引起的,可以通过将缓冲区返回给提供者来缓解。
我尝试将缓冲区转换为 CVPixelBuffer、CIImage、CGImage
let image = CIImage(cvPixelBuffer: CMSampleBufferGetImageBuffer(cmsampleBuffer)!)
create cgimage
let context = CIContext(options: nil)
let cgImage = context.createCGImage(image, from: image.extent)
liveArray.append(cgImage!)
}
在转换为 CGImage 之前,该变量不再保存缓冲区的引用。