【发布时间】:2015-05-14 03:37:29
【问题描述】:
如何从 AVframe 结构访问 YUV 数据?通过访问其数据[]? 有没有什么简单的方法可以使用opengl绘制YUV数据,而不是自己创建shader并自己绘制Y、U、V图像?
【问题讨论】:
标签: opengl video ffmpeg video-streaming
如何从 AVframe 结构访问 YUV 数据?通过访问其数据[]? 有没有什么简单的方法可以使用opengl绘制YUV数据,而不是自己创建shader并自己绘制Y、U、V图像?
【问题讨论】:
标签: opengl video ffmpeg video-streaming
是的,你使用 frame->data[]。通常每个人都使用着色器/纹理,所以你也应该使用。只需将它们作为纹理上传,使用这样的代码上传纹理:
glPixelStorei(GL_UNPACK_ROW_LENGTH, frame->linesize[0])
glActiveTexture(GL_TEXTURE0 + id);
glBindTexture(GL_TEXTURE_2D, texture[id]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, frame->width, frame->height,
0, GL_LUMINANCE, GL_UNSIGNED_BYTE, frame->data[0]);
以相同的方式上传数据[1]和[2],但将色度子采样应用于宽度/高度(例如 uvwidth = (width + 1) >> 1)。此代码还假设您在名为 texture[] 的数组中创建了 3 个纹理。在您的绘图循环中,您可以参考这些纹理 ID 以将它们链接到着色器中的统一纹理,最终用于绘制。几乎可以在任何地方找到进行 YUV 到 RGB 转换的着色器示例。
【讨论】: