我花了几天时间试图解决这个问题,但没有运气。
我正在尝试将相机Feed渲染到OpenGL纹理。我设法让它在不使用CVOpenGLESTextureCacheCreateTextureFromImage的情况下工作,只需从sampleBuffer中创建CGImage即可。我有一些非常糟糕的表现,我需要使用缓存。
作为参考,我使用了RosyWriter示例。我改变了大约十几次的东西,但这就是我现在得到的东西,对我来说只是示例,但更简化了。
我不会粘贴AV设置代码(如果需要,我可以)。这是委托方法实现:
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
size_t frameWidth = CVPixelBufferGetWidth(pixelBuffer);
size_t frameHeight = CVPixelBufferGetHeight(pixelBuffer);
CVOpenGLESTextureRef texture = NULL;
CVReturn err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,
videoTextureCache,
pixelBuffer,
NULL,
GL_TEXTURE_2D,
GL_RGBA,
frameWidth,
frameHeight,
GL_BGRA,
GL_UNSIGNED_BYTE,
0,
&texture);
if (!texture || err) {
NSLog(@"CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err);
return;
}
}
正如你所看到的那样,我删除了预览队列(尝试使用它,但没有成功)以及我认为不必要的任何内容。
传递给函数的属性看起来很好(pixelBuffer有iosurface,frameWidth / Height是正确的。)
CVOpenGLESTextureCacheCreateTextureFromImage logs
“无法创建IOSurface图像(纹理)”
并返回错误
CVOpenGLESTextureCacheCreateTextureFromImage失败(错误:-6683)
正如我所说,我尝试了很多东西,有不同的错误,有时只是有一个黑色的纹理。
我刚开始使用OpenGL,所以它可能是显而易见的,无论如何,如果有人看看这个问题会很棒。我粘贴了我认为相关的代码,如果需要其他任何我会更新。
更新
将此行添加到AV输出设置后,我停止接收错误,而是获得了空白的黑色纹理。我怀疑它可能有颜色范围/格式的东西,任何想法?
[output setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]];
答案 0 :(得分:1)
好的,所以更新中提到的行解决了错误。之后,我有一个空白的图像,不知道该怎么做。我使用了新的XCode 5 OpenGL调试器(在调试窗口中捕获OpenGL ES框架)并发现存在错误:
纹理#2使用不支持的wrap参数或两个纹理的非幂。请改用GL_CLAMP_TO_EDGE,或调整纹理大小。
之后很清楚要做什么,首先我通过添加:
来改变包装glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
相机框架出现但纹理没有更新。添加发布方法后,一切正常。
CFRelease(texture);
CVOpenGLESTextureCacheFlush(videoTextureCache, 0);
现在我不确定是否应该通过调整像素缓冲区的大小(可能会提高性能)或者只是保持原样来使纹理成为2的幂。
无论如何,希望这有助于某些人,因为我花了太多时间来解决这个问题。