• 大小: 1.17MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-08-27
  • 语言: 其他
  • 标签: OPENGL  YUV420  YUV444  QT  

资源简介

使用QT中的OpenGL播放YUV420和YUV444数据,包内自带测试用例和YUV测试数据,可以直接运行。

资源截图

代码片段和文件信息

#include “CPlay444Widget.h“
#include 
#include 
#include 

CPlay444Widget::CPlay444Widget(QWidget *parent) : QOpenGLWidget(parent)
{
    textureUniformY = 0;
    textureUniformU = 0;
    textureUniformV = 0;
    id_y = 0;
    id_u = 0;
    id_v = 0;
    m_pBufYuv420p = NULL;
    m_pVSHader = NULL;
    m_pFSHader = NULL;
    m_pShaderProgram = NULL;
    m_pTextureY = NULL;
    m_pTextureU = NULL;
    m_pTextureV = NULL;
    m_pYuvFile = NULL;
    m_nVideoH = 0;
    m_nVideoW = 0;
}

CPlay444Widget::~CPlay444Widget()
{
}

void CPlay444Widget::PlayOneframe()
{
    //函数功能读取一张yuv图像数据进行显示每单击一次,就显示一张图片
    if(NULL == m_pYuvFile)
    {
        //打开yuv视频文件 注意修改文件路径
       // m_pYuvFile = fopen(“F://OpenglYuvDemo//1920_1080.yuv“ “rb“);
         m_pYuvFile = fopen(“encode_yuv_1366_768_yuv444_frame2.yuv“ “rb“);
         m_nVideoW = 1366;
         m_nVideoH = 768;
    }

    int nLen = m_nVideoW*m_nVideoH*3;
    if(NULL == m_pBufYuv420p)
    {
        m_pBufYuv420p = new unsigned char[nLen];
        qDebug(“CPlay444Widget::PlayOneframe new data memory. Len=%d width=%d height=%d\n“
               nLen m_nVideoW m_nVideoW);
    }
    //将一帧yuv图像读到内存中
    if(NULL == m_pYuvFile)
    {
        qFatal(“read yuv file err.may be path is wrong!\n“);
        return;
    }
    fread(m_pBufYuv420p 1 nLen m_pYuvFile);
    //刷新界面触发paintGL接口
    update();
    return;
}

void CPlay444Widget::initializeGL()
{
    initializeOpenGLFunctions();
    glEnable(GL_DEPTH_TEST);
    //现代opengl渲染管线依赖着色器来处理传入的数据
    //着色器:就是使用openGL着色语言(OpenGL Shading Language GLSL)编写的一个小函数
    //       GLSL是构成所有OpenGL着色器的语言具体的GLSL语言的语法需要读者查找相关资料
    //初始化顶点着色器 对象
    m_pVSHader = new QOpenGLShader(QOpenGLShader::Vertex this);
    //顶点着色器源码
    const char *vsrc = “attribute vec4 vertexIn; \
        attribute vec2 textureIn; \
        varying vec2 textureOut;  \
        void main(void)           \
        {                         \
            gl_Position = vertexIn; \
            textureOut = textureIn; \
        }“;
    //编译顶点着色器程序
    bool bCompile = m_pVSHader->compileSourceCode(vsrc);
    if(!bCompile)
    {
    }
    //初始化片段着色器 功能gpu中yuv转换成rgb
    m_pFSHader = new QOpenGLShader(QOpenGLShader::Fragment this);
    //片段着色器源码
    const char *fsrc = “varying vec2 textureOut; \
        uniform sampler2D tex_y; \
        uniform sampler2D tex_u; \
        uniform sampler2D tex_v; \
        void main(void) \
        { \
            vec3 yuv; \
            vec3 rgb; \
            vec4 c = vec4((texture(tex_y textureOut).r - 16./255.) * 1.164); \
            vec4 U = vec4(texture(tex_u textureOut).r - 128./255.); \
            vec4 V = vec4(texture(tex_v textureOut).r - 128./255.); \
            c += V * vec4(1.596 -0.813 0 0); \
            c += U * vec4(0 -0.392 2.017 0); \
            c.a = 1.0; \
            gl_FragColor = c; \
        }“

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2018-12-13 19:12  OpenGL\
     文件        8862  2018-12-13 19:09  OpenGL\CPlay444Widget.cpp
     文件        1357  2018-12-13 16:36  OpenGL\CPlay444Widget.h
     文件        8715  2018-12-13 19:09  OpenGL\CPlayWidget.cpp
     文件        1339  2018-12-13 15:43  OpenGL\CPlayWidget.h
     文件        3690  2018-12-05 17:30  OpenGL\GLWidget.cpp
     文件         839  2018-12-01 18:54  OpenGL\GLWidget.h
     文件         407  2018-11-22 17:12  OpenGL\GLWidget.ui
     文件         328  2018-12-13 19:05  OpenGL\main.cpp
     文件         400  2018-12-05 17:45  OpenGL\MainWindow.cpp
     文件         359  2018-12-05 17:41  OpenGL\MainWindow.h
     文件        1698  2018-12-13 19:06  OpenGL\MainWindow.ui
     文件         433  2018-12-05 18:19  OpenGL\MainWindow444.cpp
     文件         386  2018-12-05 18:17  OpenGL\MainWindow444.h
     文件        1453  2018-12-13 19:06  OpenGL\MainWindow444.ui
     文件         917  2018-12-13 19:12  OpenGL\OpenGL.pro
     目录           0  2018-12-13 19:07  OpenGL\yuv\
     文件      391680  2018-11-29 15:51  OpenGL\yuv\bigbuckbunny_480x272-frame1.yuv
     文件     3147264  2018-12-12 15:58  OpenGL\yuv\encode_yuv_1366_768_yuv444_frame2.yuv

评论

共有 条评论