我正在编写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创建缓冲区的副本,但它不起作用,因为像文档说,它创建一个浅的副本.
我如何以最有效的方式处理这个问题?
| 归档时间: |
|
| 查看次数: |
744 次 |
| 最近记录: |