ffmpeg:如何从 AVframe 获取 YUV 数据并使用 opengl 绘制它?

Nya*_*uko 0 opengl video ffmpeg video-streaming

如何从 AVframe 结构访问 YUV 数据?通过访问其数据[]?是否有任何简单的方法可以使用 opengl 绘制 YUV 数据而不是创建着色器并自行绘制 Y、U、V 图像?

Ron*_*tje 5

是的,您使用 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]);
Run Code Online (Sandbox Code Playgroud)

以相同的方式上传数据 [1] 和 [2],但将色度子采样应用于宽度/高度(例如 uvwidth = (width + 1) >> 1)。此代码还假定您已在名为 texture[] 的数组中创建了 3 个纹理。在您的绘图循环中,您可以参考这些纹理 ID 将它们链接到着色器中的统一纹理,最终用于绘制。几乎可以在任何地方找到进行 YUV 到 RGB 转换的着色器示例。