【发布时间】:2014-02-01 17:57:38
【问题描述】:
我花了几天时间试图解决这个问题,但没有成功。
我正在尝试将相机输入渲染到 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 日志
“创建 IOSurface 图像(纹理)失败”
并返回错误
CVOpenGLESTextureCacheCreateTextureFromImage 失败(错误:-6683)
正如我所说,我尝试了很多东西,有不同的错误,有时只是有黑色纹理。
我刚开始使用 OpenGL,所以这可能是显而易见的,无论如何,如果有人看看这个问题,那就太好了。我粘贴了我认为相关的代码,如果有其他需要我会更新。
更新
将此行添加到 AV 输出设置后,我停止接收错误,而是得到一个空白的黑色纹理。我怀疑它可能有颜色范围/格式的东西,有什么想法吗?
[output setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]];
【问题讨论】:
-
该特定错误似乎是纹理缓存内某处的间歇性且无法解释的错误:github.com/BradLarson/GPUImage/issues/968、stackoverflow.com/questions/12646273/…、stackoverflow.com/questions/10047159/…。我只能说,我的纹理缓存在 GPUImageVideoCamera 类中运行良好:github.com/BradLarson/GPUImage,因此您可以尝试查看与此不同的地方。
-
我一定会看看的。不确定我是否在做某事,但我更新了答案,如果你看一下,将不胜感激。