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

时间:2015-05-13 15:13:55

标签: opengl video ffmpeg video-streaming

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

1 个答案:

答案 0 :(得分:2)

是的,您使用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转换的着色器示例。