我知道apple提供了一个名为GLCameraRipple的示例,它使用CVOpenGLESTextureCacheCreateTextureFromImage来实现这一目标。但是当我改为glTexImage2D时,它什么也没显示,我的代码出了什么问题?
if (format == kCVPixelFormatType_32BGRA) {
CVPixelBufferRef pixelBuf = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(pixelBuf, 0);
void *baseaddress = CVPixelBufferGetBaseAddress(pixelBuf);
glGenTextures(1, &textureID);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, baseaddress);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
CVPixelBufferUnlockBaseAddress(pixelBuf, 0);
}
非常感谢你的帮助!
答案 0 :(得分:1)
这里有几个问题。首先,GLCameraRipple示例是为了接收YUV摄像机数据而不是BGRA而构建的。您的上述代码仅上传一个BGRA数据纹理,而不是应用程序所需的单独Y和UV平面。它使用颜色空间转换着色器将这些平面合并为第一阶段,这需要YUV数据才能工作。
其次,你为每个上传的帧分配一个新的纹理,这是一个非常糟糕的主意。如果你在完成时没有删除那个纹理,这尤其糟糕,因为你会以这种方式咀嚼资源。你应该为你上传的每个平面分配一次纹理,然后在上传每个视频帧时保持纹理,只有在你完成处理视频时才删除它。
您需要重做上述内容以上传单独的Y和UV平面,或者删除/重写其颜色处理着色器。如果你去BGRA路线,你还需要确保相机现在给你BGRA帧而不是YUV帧。