2

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

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

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

4

1 回答 1

3

此委托方法的文档详细说明了这种情况:

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

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

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

于 2015-11-04T15:07:27.133 回答