我用以下方式从我的相机中获得照片:
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
guard let imageBuffer: CVImageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }
}从苹果文档 ..。
如果需要在此方法的作用域之外引用CMSampleBuffer对象,则必须在完成该方法时对其进行CFRetain,然后对其进行CFRelease。为了保持最佳性能,一些示例缓冲区直接引用可能需要设备系统和其他捕获输入重用的内存池。这种情况通常发生在未压缩设备本机捕获中,其中内存块被复制得越少越好。如果多个示例缓冲区引用这样的内存池时间太长,则输入将不再能够将新的样本复制到内存中,而这些样本将被删除。
在不显式设置CVImageBuffer的情况下保存对sampleBuffer = nil的引用可以吗?我之所以这样问,是因为Swift的最新版本自动管理CF数据结构,因此CFRetain和CFRelease不可用。
此外,“对于非压缩设备本机捕获,内存块被复制到尽可能少的情况下,原因是什么呢?”为什么首先要复制内存块?
发布于 2018-03-30 15:35:10
在不显式设置CVImageBuffer = nil的情况下保存对sampleBuffer的引用可以吗?
如果要保留对图像缓冲区的引用,那么保持对其“包含”CMSampleBuffer的引用肯定不会有任何伤害。如果您保持对CVImageBuffer的引用而不引用CMSampleBuffer,那么“正确的事情”会被执行吗?也许吧。
此外,“对于非压缩设备本机捕获,内存块被复制到尽可能少的情况下,原因是什么呢?”为什么首先要复制内存块?
关于CMSampleBuffer有很多问题,答案也不简单,所以无意中复制内存块的可能性很低。我认为本文档的目的是通知您AVCaptureVideoDataOutput是有效的!这种效率(通过固定大小的帧池)可能会产生掉帧的意外副作用,如果您将过多的CMSampleBuffer保存太长时间,那么就不要这样做。
然而,这个警告是稍微多余的,因为即使没有掉帧的幽灵,由于其大小和频率,未压缩的视频CMSampleBuffer已经是一个非常棘手的问题。您只需要引用几秒钟的值就可以使用千兆字节的RAM,因此必须尽快处理它们,然后释放/没有对它们的任何引用。
https://stackoverflow.com/questions/49571001
复制相似问题