资源简介
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
相关资源
- 基于 QT5 百度语音API 图灵机器人API 的
- Qt5.4编写的图书管理系统
- QT5.5 动态刷新tabview
- cuda 8.0 ubuntu16.04 百度云链接
- QT5.5.1串口实现在线热拔插检测
- PyQt5高阶界面控件
- Qt5.X的linuxfb平台源码补丁包
- Qt5 qml TreeView 迄今为止功能最全的树控
- qtwinmigrate for qt5
- Qt5.6.1安装qwt-6.1.2
- Qt5实现拼图+自动寻路
- Qt5写的猜数字小游戏,注释详细,入
- 计算PSNR的小程序
- QT5.12.2/QT5.12.5 QWebEngineView Ubuntu下编译
- 简单的Shell编辑器Qt5
- QT5 QSerialPort 串口收发
- qt5串口程序
- QT获取天气程序
- 一个简单的 QT5编写的 串口工具代码
- 一个简单QT5编写的录音机代码
- 自己写的yuv播放器,支持YUV420P
- 子QWidget上画图
- CUDA 9.0+cuDNN v7 for Ubuntu 16.04
- QCamera支持多摄像头切换显示
- Qt5.5 代码实现记事本程序 MiniText
- 基于TCP协议的QT聊天程序
- QT5.7+OPENGL画正方体
- source.zip
- 数字信号处理库Aquila编译及使用说明
- qtwinmigrate-2.8_1-opensource
评论
共有 条评论