从相机Feed中保留CMSampleBufferRef

时间:2014-02-20 18:22:14

标签: ios opengl-es

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

我正在使用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);

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

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

  

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

但是我不知道该怎么做。我尝试使用CMSampleBufferCreateCopy来创建缓冲区的副本,但它没有用,因为像文档说的那样,它创建了一个浅层副本。

如何以最有效的方式处理此问题?

0 个答案:

没有答案