【问题标题】:ffmpeg: how to get YUV data from AVframe and draw it using opengl?ffmpeg:如何从 AVframe 获取 YUV 数据并使用 opengl 绘制它?
【发布时间】:2015-05-14 03:37:29
【问题描述】:

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

【问题讨论】:

    标签: opengl video ffmpeg video-streaming


    【解决方案1】:

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

    【讨论】:

    • 感谢您的代码。几乎包含所需的一切。
    猜你喜欢
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    相关资源
    最近更新 更多