我正在编写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
来创建缓冲区的副本,但它没有用,因为像文档说的那样,它创建了一个浅层副本。
如何以最有效的方式处理此问题?