Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何管理CMSampleBuffer的内存_Swift_Avfoundation_Core Image_Core Foundation_Core Media - Fatal编程技术网

Swift 如何管理CMSampleBuffer的内存

Swift 如何管理CMSampleBuffer的内存,swift,avfoundation,core-image,core-foundation,core-media,Swift,Avfoundation,Core Image,Core Foundation,Core Media,我通过以下方式从相机获取帧: func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) { guard let imageBuffer: CVImageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return } } 从苹果

我通过以下方式从相机获取帧:

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
    guard let imageBuffer: CVImageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }
}
从苹果

如果需要引用此方法范围之外的CMSampleBuffer对象,则必须保留它,然后在使用完后释放它。 为了保持最佳性能,一些示例缓冲区直接引用可能需要由设备系统和其他捕获输入重用的内存池。对于未压缩的设备本机捕获,通常会出现这种情况,即尽可能少地复制内存块。如果多个样本缓冲区引用此类内存池的时间过长,则输入将无法再将新样本复制到内存中,这些样本将被丢弃

在不显式设置
sampleBuffer=nil
的情况下保留对
CVImageBuffer
的引用可以吗?我之所以这么问,是因为最新版本的Swift内存自动管理CF数据结构,所以
CFRetain
CFRelease
不可用

此外,“这通常是未压缩设备本机捕获的情况,在这种情况下,内存块被复制得尽可能少。”背后的原因是什么?为什么首先要复制内存块

在不显式设置sampleBuffer=nil的情况下保留对CVImageBuffer的引用可以吗

如果要保留对图像缓冲区的引用,那么保留对其“包含”
CMSampleBuffer
的引用肯定不会有什么坏处。如果您保留对
CVImageBuffer
的引用,而不是对
CMSampleBuffer
的引用,那么“正确的做法”会被执行吗?也许吧

此外,“这通常是未压缩设备本机捕获的情况,在这种情况下,内存块被复制得尽可能少。”背后的原因是什么?为什么首先要复制内存块

有很多问题,答案也不简单,所以无意中复制内存块的几率很低。我认为本文档的目的是告诉您,
avcapturedevideodataoutput
是高效的!如果您将太多的
CMSampleBuffer
s挂起太久,那么这种效率(通过固定大小的帧池)可能会产生意外的副作用,即丢弃帧,所以不要这样做


然而,警告有点多余,因为即使没有掉帧的幽灵,未压缩视频
CMSampleBuffer
s由于其大小和频率已经是一个非常棘手的问题。您只需引用几秒钟就可以使用千兆字节的RAM,因此必须尽快处理它们,然后释放/nil对它们的任何引用。

谢谢。我如何决定是否要删除样本缓冲区?您到底在用它们做什么?我希望通过网络发送捕获的图像,同时尽可能少地在设备上执行工作。所以,我想,我不是在设备上把它转换成CIImage,而是通过网络发送缓冲区,然后在另一端(Mac应用程序)对它进行解码,就一帧或一个流?它们相当大,即使只有一个,你也应该压缩它们。这有点像兔子洞。如果是流,请查看此答案中的注释-询问者正在使用
webRTC
plus
apprtc ios
对其进行视频呼叫类型appA流