来自iOS相机的引用CVPixelBuffer的限制

时间:2015-11-04 14:58:09

标签: ios cvpixelbuffer

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

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

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

1 个答案:

答案 0 :(得分:2)

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

  

为了保持最佳性能,某些样本缓冲区直接引用可能需要由设备系统和其他捕获输入重用的内存池。对于未压缩的设备本机捕获,通常会出现这种情况,其中尽可能少地复制内存块。如果多个样本缓冲区长时间引用此类内存池,则输入将无法再将新样本复制到内存中,并且这些样本将被丢弃。

     

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

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