无法将相机输入渲染为OpenGL纹理(iOS)

时间:2014-02-01 17:57:38

标签: ios opengl-es

我花了几天时间试图解决这个问题,但没有运气。

我正在尝试将相机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]];

1 个答案:

答案 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的幂。

无论如何,希望这有助于某些人,因为我花了太多时间来解决这个问题。