首页| 论坛| 消息

标题:Qt音视频开发22-通用GPU显示
作者:liudianwu
日期:2020-09-01 11:04
内容:

## 一、前言
采用GPU来绘制实时视频一直以来都是个难点,如果是安防行业的做视频监控开发这块的人员,这个坎必须迈过去,本人一直从事的是安防行业的电子围栏这个相当小众的细分市场的开发,视频监控这块仅仅是周边技术玩一玩探讨一下,关于GPU绘制这块着实走了不少的弯路。
之前用ffmpeg解码的时候,已经做了硬解码的处理,比如支持qsv、dxva2、d3d11va等方式进行硬解码处理,但是当时解码出来以后,还是重新转成了QImage来绘制,这样就大打折扣了,尽管可以看到GPU使用率有了,但是依然耗时的操作还是在CPU绘制显示,这就显得很尴尬了,Qt封装了大部分的opengl的操作,直接做成了QOPenGLWidget,既支持ffmpeg解码出来的yuyv格式的数据显示,还支持硬解码出来的nv12格式的数据显示,很好很强大,这样的话就大大减轻了CPU的压力,专门交给GPU绘制,经过这么一番彻底的改造,效率提升至少5倍,不要太牛逼!如果开启了opengl绘制,则对应内存会增加不少,可能opengl绘制需要开辟很多的内存来交换数据吧。
采用GPU显示需要同时支持yuyv格式和nv12格式,因为有些配置差的电脑,硬解码很可能歇菜,此时就需要用opengl来直接绘制ffmpeg软解码出来的yuyv数据,做到自动切换,这样就兼容了所有的可能的情况。测试发现ffmpeg4的性能要优于ffmpeg3,64位的性能要优于32位的,在64位的操作系统上,UDP协议性能要优于TCP性能,但是可能会丢包。
| 方案 | CPU | 内存 | GPU |
| ------ | ------ | ------ | ------ |
| none+none | 12% | 147MB | 0% |
| dxva2+none | 3% | 360MB | 38% |
| d3d11va+none | 2% | 277MB | 62% |
| none+painter | 30% | 147MB | 0% |
| dxva2+painter | 30% | 360MB | 38% |
| d3d11va+painter | 21% | 277MB | 62% |
| none+yuyv | 17% | 177MB | 22% |
| dxva2+yuyv | 25% | 400MB | 38% |
| d3d11va+yuyv | 18% | 30MB | 65% |
| qsv+nv12 | 22% | 970MB | 40% |
| dxva2+nv12 | 20% | 380MB | 40% |
| d3d11va+nv12 | 15% | 320MB | 62% |
## 二、功能特点
1. 支持多画面切换,全屏切换等,包括1+4+6+8+9+13+16+25+36+64画面切换。
2. 支持alt+enter全屏,esc退出全屏。
3. 自定义信息框+错误框+询问框+右下角提示框(包含多种格式)。
4. 17套皮肤样式随意更换,所有样式全部统一,包括菜单等。
5. 云台仪表盘鼠标移上去高亮,八个方位精准识别。
6. 底部画面工具栏(画面分割切换+截图声音等设置)移上去高亮。
7. 可在配 ..


#1 [weinkym 09-02 21:54]

#2 [programmerhz 09-18 14:46]
感谢分享,正在整这个,学习了!

回复 发表
主题 版块