资源简介
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
相关资源
- Trojan-Qt5-Windows-0.0.4.rar
- QT局域网聊天系统(基于QT5.修改过)
- 周立功PCI CAN卡LINUX驱动ubuntu16.04内核
- QT5.5入门与项目实战
- 基于FFmpeg4.0.2的AAC编码器
- mp4_play.zip
- 使用Qt编写的视频监控系统支持Qt4-Q
- Qt 多线程连接数据库——数据库
- 基于Qt5.8+OpenCV3.2的Basler多相机触发开
- ( YUV420(YV12)与YUY2(YUV422YUYV)格式
- zedboard ubuntu16.04文件系统
- 串口调试助手 Qt5版源码
- Qt5的多线程小程序,实现按钮开关线
- Ubuntu16.04中配置Qt5.9.1和OpenCV3.4.0过程
- YUV Viewer 附测试文件格式:yuv420
- Qt pdf poppler
- 基于Qt5的串口调试助手
- Qt类关系图
- ubuntu16.04 64位版迅雷
- PyQt5编写的大数据应用-高速公路违章
- QT5.9.0实现的QWidget版富文本编辑器
- Qt5版NeHe OpenGL教程6-10
- QT5下实现基于TCP发送和接接收文件
- PyQt5_gpl-5.11.3.zip
- qtribbon可用
- qt5串口简单实现图片、pdf文件的传输
- qt5.8实现rtsp流播放
- QT5检测USB设备
- Qt5.5 开发 Creo3.0 案例
-
Qt5.8 QMediaPla
yer 音乐播放器
评论
共有 条评论