Qt编写安防视频监控系统27-GPU显示( 二 )


30. 支持onvif云台控制,可上下左右移动云台摄像机,包括复位和焦距调整等 。
31. 同时支持sqlite、MySQL、postsql等数据库 。
32. 可保存视频,可选定时存储或者单文件存储,可选存储间隔时间 。
33. 可设置视频流通信方式tcp+udp,可设置视频解码是速度优先、质量优先、均衡等 。
34. 可设置硬解码类型,支持qsv、dxva2、d3d11va等 。
35. 默认采用opengl绘制视频,超低的CPU资源占用,支持yuyv和nv12两种格式绘制,很牛逼 。
36. 高度可定制化,用户可以很方便的在此基础上衍生自己的功能,支持linux和mac系统 。
## 三、效果图

Qt编写安防视频监控系统27-GPU显示

文章插图
 
## 四、核心代码void NV12OpenGLWidget::initializeGL(){initializeOpenGLFunctions();glDisable(GL_DEPTH_TEST);//存储顶点坐标和纹理坐标static const GLfloat points[] = {-1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f};//顶点缓冲对象初始化vbo.create();vbo.bind();vbo.allocate(points, sizeof(points));//初始化shaderthis->initShader();//初始化texturesthis->initTextures();//初始化颜色this->initColor();}void NV12OpenGLWidget::paintGL(){if (!dataY || !dataUV || width == 0 || height == 0) {this->initColor();return;}program.bind();program.enableAttributeArray("vertexIn");program.enableAttributeArray("textureIn");program.setAttributeBuffer("vertexIn", GL_FLOAT, 0, 2, 2 * sizeof(GLfloat));program.setAttributeBuffer("textureIn", GL_FLOAT, 2 * 4 * sizeof(GLfloat), 2, 2 * sizeof(GLfloat));glActiveTexture(GL_TEXTURE0 + 1);glBindTexture(GL_TEXTURE_2D, textureY);//字节对齐,网上很多代码都是少了这一步,导致有时候花屏glPixelStorei(GL_UNPACK_ROW_LENGTH, linesizeY);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width, height, 0, GL_RED, GL_UNSIGNED_BYTE, dataY);glActiveTexture(GL_TEXTURE0 + 0);glBindTexture(GL_TEXTURE_2D, textureUV);//字节对齐,网上很多代码都是少了这一步,导致有时候花屏glPixelStorei(GL_UNPACK_ROW_LENGTH, linesizeUV >> 1);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);glTexImage2D(GL_TEXTURE_2D, 0, GL_RG, width >> 1, height >> 1, 0, GL_RG, GL_UNSIGNED_BYTE, dataUV);glDrawArrays(GL_QUADS, 0, 4);program.setUniformValue("textureY", 1);program.setUniformValue("textureUV", 0);program.disableAttributeArray("vertexIn");program.disableAttributeArray("textureIn");program.release();}




推荐阅读