从相机Feed中保留CMSampleBufferRef

Ili*_*ija 7 opengl-es ios

我正在编写AR应用程序,使用相机进纸拍摄位于世界某些地方的照片.现在我遇到了问题,我不知道该怎么做.

我正在使用CVOpenGLESTextureCacheRef从CMSampleBufferRef创建纹理.正在显示相机进纸,它完美运行.当我捕获12张照片并从中创建纹理时会出现问题.它的工作方式是,一旦我检测到与目标匹配,我就会创建一个这样的纹理:

CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBufferCopy);

size_t frameWidth = CVPixelBufferGetWidth(pixelBuffer);
size_t frameHeight = CVPixelBufferGetHeight(pixelBuffer);
CVOpenGLESTextureRef texture = NULL;
CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,
                                                            cache,
                                                            pixelBuffer,
                                                            NULL,
                                                            GL_TEXTURE_2D,
                                                            GL_RGBA,
                                                            (GLsizei)frameWidth,
                                                            (GLsizei)frameHeight,
                                                            GL_BGRA,
                                                            GL_UNSIGNED_BYTE,
                                                            0,
                                                            &texture);


if (!texture || err) {
    NSLog(@"CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err);
    return;
}

CVOpenGLESTextureCacheFlush(cache, 0);
Run Code Online (Sandbox Code Playgroud)

然后将纹理映射到世界中的照片位置并进行渲染.我不是在这里发布纹理,因为我将来需要它.用作相机进纸的纹理显然正在被释放.

拍摄第12张照片时会出现此问题.该captureOutput:didOutputSampleBuffer:fromConnection:回调不叫了.我知道它发生是因为池已满,就像文档中指出的那样:

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

但是我不知道该怎么做.我尝试使用CMSampleBufferCreateCopy创建缓冲区的副本,但它不起作用,因为像文档说,它创建一个浅的副本.

我如何以最有效的方式处理这个问题?