资源简介

yuv420在qt5下的使用opengl显示方法,在ubuntu16下测试通过。

资源截图

代码片段和文件信息

#include “cplaywidget.h“
#include 
#include 
#include 


CPlayWidget::CPlayWidget(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;
}

CPlayWidget::~CPlayWidget()
{

}

void CPlayWidget::PlayOneframe()
{//函数功能读取一张yuv图像数据进行显示每单击一次,就显示一张图片

    if(NULL == m_pYuvFile)
    {
        //打开yuv视频文件 注意修改文件路径
       // m_pYuvFile = fopen(“F://OpenglYuvDemo//coastguard_cif.yuv“ “rb“);
         m_pYuvFile = fopen(“/home/root/test_cif.yuv“ “rb“);

         m_nVideoW = 352;
         m_nVideoH = 288;
        //根据yuv视频数据的分辨率设置宽高demo当中是1080p,这个地方要注意跟实际数据分辨率对应上
//        m_nVideoW = 1920;
//        m_nVideoH = 1080;
    }



    //申请内存存一帧yuv图像数据其大小为分辨率的1.5倍
    int nLen = m_nVideoW*m_nVideoH*3/2;
    if(NULL == m_pBufYuv420p)
    {
        m_pBufYuv420p = new unsigned char[nLen];
        qDebug(“CPlayWidget::PlayOneframe new data memory. Len=%d width=%d height=%d\n“
               nLen m_nVideoW m_nVideoH);
    }

    //将一帧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 CPlayWidget::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; \
        yuv.x = texture2D(tex_y textureOut).r; \
        yuv.y = texture2D(tex_u textureOut).r - 0.5; \
        yuv.z = texture2D(tex_v textureOut).r - 0.5; \
        rgb = mat3( 1       1         1 \
                    0       -0.39465  2.03211 \
                    1.13983 -0.58060  0) * yuv; \
        gl_FragColor = vec4(rgb 1); \
    }“;

    //将glsl源码送入编译器编译着色器程序
    bCompile = m_pFSHader->compileS

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        1475  2018-09-08 17:07  cplaywidget.h
     文件         172  2018-09-08 16:36  main.cpp
     文件         873  2018-09-19 13:37  mainwindow.cpp
     文件         499  2018-09-12 11:35  mainwindow.h
     文件        1751  2018-09-19 13:37  mainwindow.ui
     文件         603  2018-09-14 14:14  slYuv.pro
     文件       46303  2018-09-19 14:27  slYuv.pro.user
     文件        8730  2018-09-19 14:26  cplaywidget.cpp

评论

共有 条评论