资源简介
使用QT中的OpenGL播放YUV420和YUV444数据,包内自带测试用例和YUV测试数据,可以直接运行。
代码片段和文件信息
#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迷宫游戏
- OpenGL绘制三维地形图184196
- opengl烟花
- 鼠标控制物体缩放旋转opengl+glut
- QT+OpenGL开发而成,能以点,线,面,
- 7YUV 原始图像YUV数据显示播放工具
- vs用opengl环境搭建freeglut+glew 64位 包自
- yuv转bmp(16位24位32位)工具与vc工程
- md3loader,导入md3模型源程序
- OpenGL三维建模与坐标变换
- OpenGL 雪景与雪人的绘制
- opengl_shader_鱼眼校正
- opengl 雪花飞舞
- OpenGL实践二:基于分形的山地地形绘
- OpenGL实践一:音乐喷泉真实感模拟
- OpenGL太阳地球月亮纹理实现
- VS2017+OpenGL配置所需文件.rar
- 微软OpenGL的22个
- opengl 实现的立体旋转球
- OpenGL安装库glutgltoolsglewfreeglut
- Opengl程序 时钟制作
- OpenGL环境下贴图法画树代码
- OpenGL环境配置文件
- v4l2采集+yuyv转yuv420p+h264编码+tcp传输
- openGL构造教室.docx
- 第一人称3D射击游戏源代码OpenGL
- 实现鼠标点击图形填充
- glfw-3.3.zip
- OpenGL所有库OpenGL,freeglut、glu、glut、
- opengl实现光线跟踪算法
评论
共有 条评论