【问题标题】:Limit of referenced CVPixelBuffer coming from the iOS camera来自 iOS 相机的引用 CVPixelBuffer 的限制
【发布时间】:2016-02-05 03:13:55
【问题描述】:

我有一个应用程序,用于保存来自 iOS 相机的帧 (CVPixelBuffer)。我使用委托方法 -(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer (CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection .

由于最近的 iOS 更新,如果前一次没有释放,则没有更多的帧通过委托方法到达。现在CVPixelBufferUnlockBaseAddressCVPixelBufferRelease 需要在新帧到来之前调用存储的帧。

有什么想法吗?我认为有一些硬件优化,但我找不到细节。

【问题讨论】:

    标签: ios cvpixelbuffer


    【解决方案1】:

    documentation for this delegate method 详细说明了这种情况:

    为保持最佳性能,一些样本缓冲区直接引用可能需要由设备系统和其他捕获输入重用的内存池。对于未压缩的设备本机捕获,这种情况经常发生,其中内存块被复制得越少越好。如果多个样本缓冲区引用此类内存池的时间过长,输入将不再能够将新样本复制到内存中,并且这些样本将被丢弃。

    如果您的应用程序由于保留提供的 CMSampleBufferRef 对象太久而导致样本被丢弃,但它需要长时间访问样本数据,请考虑将数据复制到新缓冲区中,然后释放样本缓冲区(如果它以前被保留),以便它引用的内存可以被重用。

    这应该不足为奇。视频捕获系统不想花时间为每一帧分配新内存。内存分配,尤其是大块的内存分配非常昂贵。

    【讨论】:

    • 在相机源上做了很多工作,我可以添加一点。至少在 iPhone 7 上,相机有一个大约 13 帧的缓冲池。如果您设法将处理时间保持在 25 毫秒内,则可以安全地使用相机中的缓冲区。如果没有,您要么实现一个生产者/消费者机制,允许您丢弃帧(因此将它们返回到相机系统而不进行处理),或者您制作每个帧的副本并返回原始帧。无论哪种方式,您都需要释放相机帧......否则您会出现内存泄漏。
    猜你喜欢
    • 2021-07-14
    • 2019-07-03
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 2019-04-07
    • 1970-01-01
    • 2019-10-09
    相关资源
    最近更新 更多