gpt4 book ai didi

ios - iPhone OpenGLES 视频纹理

转载 作者:行者123 更新时间:2023-11-29 04:41:42 25 4
gpt4 key购买 nike

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

关于ios - iPhone OpenGLES 视频纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10293828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com