Qt 使用openGL 渲染YUV420P格式的视频

代码如下

1YUV420P_Render.h 2 3#ifndef YUV420P_RENDER_H 4#define YUV420P_RENDER_H 5 6#include <QObject> 7#include <QOpenGLWidget> 8#include <QOpenGLFunctions> 9#include <QOpenGLShaderProgram> 10class YUV420P_Render: protected QOpenGLFunctions 11{ 12 13public: 14 YUV420P_Render(); 15 ~YUV420P_Render(); 16 17 //初始化gl 18 void initialize(); 19 //刷新显示 20 void render(uchar* py,uchar* pu,uchar* pv,int width,int height,int type); 21 void render(uchar* ptr,int width,int height,int type); 22 23private: 24 //shader程序 25 QOpenGLShaderProgram m_program; 26 //shader中yuv变量地址 27 GLuint m_textureUniformY, m_textureUniformU , m_textureUniformV; 28 //创建纹理 29 GLuint m_idy , m_idu , m_idv; 30 31}; 32 33#endif // YUV420P_RENDER_H 34 35YUV420P_Render.cpp 36 37#include "YUV420P_Render.h" 38#include <QDebug> 39#include <QTimer> 40 41#define ATTRIB_VERTEX 0 42#define ATTRIB_TEXTURE 1 43 44YUV420P_Render::YUV420P_Render() 45{ 46} 47 48YUV420P_Render::~YUV420P_Render() 49{ 50} 51 52 //初始化gl 53void YUV420P_Render::initialize() 54{ 55 qDebug() << "initializeGL"; 56 57 //初始化opengl (QOpenGLFunctions继承)函数 58 initializeOpenGLFunctions(); 59 60 //顶点shader 61 const char *vString = 62 "attribute vec4 vertexPosition;\ 63 attribute vec2 textureCoordinate;\ 64 varying vec2 texture_Out;\ 65 void main(void)\ 66 {\ 67 gl_Position = vertexPosition;\ 68 texture_Out = textureCoordinate;\ 69 }"; 70 //片元shader 71 const char *tString = 72 "varying vec2 texture_Out;\ 73 uniform sampler2D tex_y;\ 74 uniform sampler2D tex_u;\ 75 uniform sampler2D tex_v;\ 76 void main(void)\ 77 {\ 78 vec3 YUV;\ 79 vec3 RGB;\ 80 YUV.x = texture2D(tex_y, texture_Out).r;\ 81 YUV.y = texture2D(tex_u, texture_Out).r - 0.5;\ 82 YUV.z = texture2D(tex_v, texture_Out).r - 0.5;\ 83 RGB = mat3(1.0, 1.0, 1.0,\ 84 0.0, -0.39465, 2.03211,\ 85 1.13983, -0.58060, 0.0) * YUV;\ 86 gl_FragColor = vec4(RGB, 1.0);\ 87 }"; 88 89 //m_program加载shader(顶点和片元)脚本 90 //片元(像素) 91 qDebug()<<m_program.addShaderFromSourceCode(QOpenGLShader::Fragment, tString); 92 //顶点shader 93 qDebug() << m_program.addShaderFromSourceCode(QOpenGLShader::Vertex, vString); 94 95 //设置顶点位置 96 m_program.bindAttributeLocation("vertexPosition",ATTRIB_VERTEX); 97 //设置纹理位置 98 m_program.bindAttributeLocation("textureCoordinate",ATTRIB_TEXTURE); 99 100 //编译shader 101 qDebug() << "m_program.link() = " << m_program.link(); 102 103 qDebug() << "m_program.bind() = " << m_program.bind(); 104 105 //传递顶点和纹理坐标 106 //顶点 107 static const GLfloat ver[] = { 108 -1.0f,-1.0f, 109 1.0f,-1.0f, 110 -1.0f, 1.0f, 111 1.0f,1.0f 112// -1.0f,-1.0f, 113// 0.9f,-1.0f, 114// -1.0f, 1.0f, 115// 0.9f,1.0f 116 }; 117 //纹理 118 static const GLfloat tex[] = { 119 0.0f, 1.0f, 120 1.0f, 1.0f, 121 0.0f, 0.0f, 122 1.0f, 0.0f 123 }; 124 125 //设置顶点,纹理数组并启用 126 glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, ver); 127 glEnableVertexAttribArray(ATTRIB_VERTEX); 128 glVertexAttribPointer(ATTRIB_TEXTURE, 2, GL_FLOAT, 0, 0, tex); 129 glEnableVertexAttribArray(ATTRIB_TEXTURE); 130 131 //从shader获取地址 132 m_textureUniformY = m_program.uniformLocation("tex_y"); 133 m_textureUniformU = m_program.uniformLocation("tex_u"); 134 m_textureUniformV = m_program.uniformLocation("tex_v"); 135 136 //创建纹理 137 glGenTextures(1, &m_idy); 138 //Y 139 glBindTexture(GL_TEXTURE_2D, m_idy); 140 //放大过滤,线性插值 GL_NEAREST(效率高,但马赛克严重) 141 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 142 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 143 144 //U 145 glGenTextures(1, &m_idu); 146 glBindTexture(GL_TEXTURE_2D, m_idu); 147 //放大过滤,线性插值 148 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 149 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 150 151 //V 152 glGenTextures(1, &m_idv); 153 glBindTexture(GL_TEXTURE_2D, m_idv); 154 //放大过滤,线性插值 155 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 156 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 157 158 glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 159 glClear(GL_COLOR_BUFFER_BIT); 160 161} 162 163//刷新显示 164void YUV420P_Render::render(uchar* py,uchar* pu,uchar* pv,int width,int height,int type) 165{ 166 glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 167 glClear(GL_COLOR_BUFFER_BIT); 168 169 glActiveTexture(GL_TEXTURE0); 170 glBindTexture(GL_TEXTURE_2D, m_idy); 171 //修改纹理内容(复制内存内容) 172 glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width, height, 0, GL_RED, GL_UNSIGNED_BYTE,py); 173 //与shader 关联 174 glUniform1i(m_textureUniformY, 0); 175 176 glActiveTexture(GL_TEXTURE0+1); 177 glBindTexture(GL_TEXTURE_2D, m_idu); 178 //修改纹理内容(复制内存内容) 179 glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width/2, height/2, 0, GL_RED, GL_UNSIGNED_BYTE, pu); 180 //与shader 关联 181 glUniform1i(m_textureUniformU,1); 182 183 glActiveTexture(GL_TEXTURE0+2); 184 glBindTexture(GL_TEXTURE_2D, m_idv); 185 //修改纹理内容(复制内存内容) 186 glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width/2, height/2, 0, GL_RED, GL_UNSIGNED_BYTE, pv); 187 //与shader 关联 188 glUniform1i(m_textureUniformV, 2); 189 190 glDrawArrays(GL_TRIANGLE_STRIP,0,4); 191 qDebug() << "paintGL"; 192} 193 194void YUV420P_Render::render(uchar* ptr,int width,int height,int type) 195{ 196 glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 197 glClear(GL_COLOR_BUFFER_BIT); 198 199 glActiveTexture(GL_TEXTURE0); 200 glBindTexture(GL_TEXTURE_2D, m_idy); 201 //修改纹理内容(复制内存内容) 202 glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width, height, 0, GL_RED, GL_UNSIGNED_BYTE,ptr); 203 //与shader 关联 204 glUniform1i(m_textureUniformY, 0); 205 206 glActiveTexture(GL_TEXTURE0+1); 207 glBindTexture(GL_TEXTURE_2D, m_idu); 208 //修改纹理内容(复制内存内容) 209 glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width/2, height/2, 0, GL_RED, GL_UNSIGNED_BYTE, ptr+width*height); 210 //与shader 关联 211 glUniform1i(m_textureUniformU,1); 212 213 glActiveTexture(GL_TEXTURE0+2); 214 glBindTexture(GL_TEXTURE_2D, m_idv); 215 //修改纹理内容(复制内存内容) 216 glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width/2, height/2, 0, GL_RED, GL_UNSIGNED_BYTE, ptr+width*height*5/4); 217 //与shader 关联 218 glUniform1i(m_textureUniformV, 2); 219 220 glDrawArrays(GL_TRIANGLE_STRIP,0,4); 221 qDebug() << "paintGL"; 222}

 最后写一个窗口类继承 QOpenGLWidget

1重写两个函数void initializeGL(); //调用上面渲染类的初始化函数 2 3void paintGL();//调用上面渲染类的渲染函数
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Qt 使用openGL 渲染YUV420P格式的视频 - HelloWorld