【问题标题】:iphone OpenGLES video textureiphone OpenGLES 视频纹理
【发布时间】:2012-04-25 00:40:59
【问题描述】:

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

非常感谢您的帮助!

【问题讨论】:

    标签: ios opengl-es textures


    【解决方案1】:

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

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

    您需要重新处理以上内容以上传单独的 Y 和 UV 平面,或者删除/重写它们的颜色处理着色器。如果您采用 BGRA 路线,您还需要确保相机现在为您提供 BGRA 帧而不是 YUV 帧。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多