资源简介
使用QT中的OpenGL播放YUV420和YUV444数据,包内自带测试用例和YUV测试数据,可以直接运行。
![](http://www.nz998.com/pic/31849.jpg)
代码片段和文件信息
#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-fr
文件 3147264 2018-12-12 15:58 OpenGL\yuv\encode_yuv_1366_768_yuv444_fr
- 上一篇:SPSS案例数据.rar
- 下一篇:ANSYS分析集(命令流)
相关资源
- OpenGL参考手册
- Qt Creator opengl实现四元数鼠标控制轨迹
- OpenGL文档,api大全,可直接查询函数
- opengl轮廓字体源代码
- MFC读三维模型obj文件
- 利用OpenGL写毛笔字算法
- MFC中OpenGL面和体的绘制以及动画效果
- 基于OPENGL的光线跟踪源代码368758
- VC 实现三维旋转(源码)
- 自编用openGL实现3D分形树,分形山
- OpenGL球形贴图自旋程序
- OpenGL导入贴图的Texture类
- 计算机图形学(openGL)代码
- 用OpenGL开发的机械臂运动仿真程序(
- OpenGL-3D坦克模拟
- OPENGL实现世界上最小的3D游戏
- VS2012OpenGL配置所需要的全部libdllh文件
- 基于OpenGL的仿蝗虫机器人三维动态仿
- 图形学 - OpenGL实现3种三维茶壶显示源
- opengl程序-会跳舞的骷髅
- opengl实现三维网格光顺Laplacian算法
- opengl——爆炸
- OpenGL三维地形建模
- opengl游戏编程徐明亮版(含源码)
- 用OPENGL画的一个简单的直升飞机
- opengl完美天空盒
- 3D绘图程序设计:使用Direct3D 10/9和Ope
- OpenGL绘制可运动自行车源程序.zip
- OpenGL实现飘动效果
- opengl室内场景的绘制,包括碰撞检测
评论
共有 条评论