繁体   English   中英

iPhone OpenGLES视频纹理

[英]iphone OpenGLES video texture

我知道苹果提供了一个名为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);
}

非常感谢您的帮助!

这里有两个问题。 首先,构建GLCameraRipple示例以接收YUV摄像机数据,而不是BGRA。 您上面的代码仅上传一个BGRA数据纹理,而不是应用程序期望的单独的Y和UV平面。 它使用色彩空间转换着色器将这些平面合并为第一阶段,并且需要YUV数据才能起作用。

其次,您要为每个上载的帧分配新的纹理,这是一个非常糟糕的主意。 如果您在完成后不删除该纹理,则尤其糟糕,因为您将以这种方式消耗资源。 您应该为要上传的每个平面分配一次纹理,然后在上传每个视频帧时保留该纹理,仅在处理完视频后才将其删除。

您将需要重新整理上面的内容以分别上传Y和UV平面,或者删除/重写其色彩处理着色器。 如果您沿BGRA路线行驶,还需要确保相机现在为您提供BGRA镜框,而不是YUV镜框。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM