之前很久就考虑过这个问题,为什么视频在界面刷新那么快,而Qt的界面依然很流畅。在做过多路视频播放后,接触了SDL播放视频,自已也实现了opengl播放视频,也使用过Qt的MediaPlayer播放视频。对比效果终于有结果了,原来是视频这种高频率的刷新本来就有能用widget这种QPainter来画的,是使用的GPU渲染。以下是我对多路视频播放实践的一些效果对比。

1、SDL:(以下仅针对图像刷新)

优点:后台渲染,只需要传入窗口句柄,与Qt是不同的图形显示框架;完全可以在非GUI线程中传入句柄和图像数据,完全不影响GUI线程的刷新,因为它连Qt的事件循环都没有进入,更新显示是使用的传入句柄后台显示的,SDL自已的刷新策略。可以显示的视频格式多。GPU转换图像格式

缺点:由于没有进入Qt的事件循环,所以在widget这种GUI程序update()的时候,如果没有禁用updatesEnable()那么Qt对这个widget也会重绘刷新一次,而这上widget的句柄SDL也在用,如此就会造成闪屏。另外,如果在视频上放一些Qt的一些widget控件,也会造成闪屏(或者直接没有),这也是因为视频的刷新是SDL,而视频上面的刷新是Qt。SDL里面的窗口叠加和Qt的窗口叠加应该不一样导致的吧,直接没显示,可能是因为你禁用了updatesEnable(),视频上面的widgets都不会刷新了。所以要在视频上面画图案就只有用SDL在视频上面画了,另外如果禁用updatesEnable(),在多分屏窗口如果窗口从大的窗口变成小的多个窗口时,就会花屏了,因为大的窗口的区域没有刷新。

2、 QOpenGLWidget:

优点 : 使用GUI渲染视频,widget原生控件,可以在视频上面放其它widget控件,不会闪屏之类 其它问题,可以自定义shader显示yuv、nv12等视频格式。GPU转换图像格式

缺点 :进入了Qt的事件循环, 刷新多路视频的时候,某一时刻每一路视频的每帧图像依然是在一个openglwidget中传入数据给opengl渲染后,再接着下一个,这里的每一个openglwidget都相当于一个opengl场景。由于以上原因,我的电脑i5CPU、显卡是英伟达的(型号忘了,反正够显示了),在显示20个每秒25帧的视频画面时,有一点卡滞但不严重。由于是给一个openglwidget传递数据等它渲染好了,再到下一个,所以主循环耗掉了一些时间,但opengl渲染给力,每个耗时不长,所以卡滞不严重。

3 、自定义qml视频显示控件

优点 : 使用GPU渲染;如果是QQuick应用,那么还有多线程渲染。可以在视频上面放置其它qml控件,所有的qml控件在同一个图像渲染场景中,本身就是一个状态机,可以一次把多路视频都渲染了,因为qml场景中的渲染,就是渲染场景中有变化的都一次性渲染了,当外部把数据传进来时,并不是立即刷新的,而是把数据给到了渲染场景中,再下一次刷新时,会一个结点一个节点的取数据,一次性渲染,所以效果较好。显示100路25帧的视频时,界面依然很流畅

缺点 : 进入了事件循环,开发windows应用周期长,一些复杂控件,像QTreeWidget、QDateTime、QTableView这种复杂控件没有传统的widget功能齐全。我实现的是需要外部转换图像格式,不能直接显示Yuv和Nv12这种视频格式,qt封装的类中我暂没看到可以用来解码的,可能也有像材质、纹理之类的可以处理,暂不清楚。

4 、 QMediaPlayer

优点 : 官方控件,支持格式多,用directshow做底层,不用处理视频、音频解码,功能齐全。界面流畅效果和使用SDL一样,非常流畅,rtsp和http视频都可以

缺点 : 需要安装K-Lite插件(里面包含directshow),我电脑测试显示最多8路视频同时播放,再多程序就挂了。直接以QVideoWidget为父对象放Qt控件时,直接不显示。以QVideoWidget的父对象为父对象放置控件,并把位置调整到视频上,背景不能透明,应该是放置上去的控件在栈区中的分层在QVideoWidget的下面,而其中的视频可能是在类似3d场景中渲染的,3d场景中默认的背景是黑色(猜测)。不能自字义使用多张显示(解码),directshow的GUI配置里面是选择其中一种

这是我针对视频显示的看法,如果是显示多路视频的话,首先由于多路视频解码很可能是多张显卡,所以,我的方案如下;

1、SDL    显示路数非常多(二十路以上这种),对SDL熟悉,能在视频上面显示其它东西,比如画矩形,线,文字这种,能够接受widget刷新时的闪屏(很快,但还是能看出来,如果禁用刷新,在多路全屏和正常显示时或其它操作,与其它widget控件的布局很可能造成花屏)

2、QOpenGLWidget 显示路数中等20路左右

3、 qml自定义视频 显示路数非常多(20路以上),一般为windows应用,可以使用QQuickWidget把qml嵌入到widget应用中,CPU配置较好,i5以上吧(用于图像格式转换,个人不会单独使用GPU图像格式转换,像CUDA这种)。

以上显示都需要自己写视频的解码,在视频解码中就可以自由选择显卡了,视频解码还没搞懂。

如果是显示单路、两路、三路这种,对视频上面的控件没有透明要求还是用QMediaPlayer吧,安装个插件,什么格式都支持,解码也搞定了。

Qt播放多路视频的理解相关推荐

  1. QT播放本地视频和网络视频

    首先,需要使用到模块有multimedia 和multimediawidgets, 在QT中.pro文件添加 QT += multimedia multimediawidgets 1.本地视频播放 _ ...

  2. Qt 播放Yuv420p视频

    环境: vs2015;Qt5.8;opencv3.4; 从文件读取一帧的数据后从yuv转到rgb,用rgb构造一个IplImage,再把IplImage 转成QImage,显示. yuv420转rgb ...

  3. Qt多路视频监控软件(Qt+VLC支持本地视频/RTSP流/RTMP流)

    Qt多路视频监控软件(Qt+VLC支持本地视频/RTSP流/RTMP流) 功能: 支持同时播放多路视频源: 支持播放本地视频,包括MP4.mkv.flv等视频格式: 支持播放RTSP/RTMP视频流: ...

  4. wfs.js 多路视频 串屏 闪烁

    wfs.js播放多路视频,有时会有串屏现象.不知道为什么. 解决方法:用iframe封装起来 或者封装成组件. 闪烁的原因是宽高设置太小,设置大一点就好了.

  5. Qt源码解析-源码解析-QVideoWidget播放手机视频旋转问题

    Qt源码解析 索引 Qt源码解析-源码解析-QVideoWidget播放手机视频旋转问题 问题描述与复现 使用手机拍摄的视频是竖屏的,上传后,使用QVideoWidget播放,变成横屏. 总结,可以让 ...

  6. 【Qt 开源音视频框架模块QtAV】03:QTAV主要接口展示以及播放器源码分享

    介绍 QtAV 是一个基于 Qt 和 FFmpeg 的跨平台.高性能多媒体播放框架,能够帮助你轻而易举地编写出一个播放器. [Qt 开源音视频框架模块QtAV]01:介绍.编译以及简单使用 因为网上使 ...

  7. QT实现播放wmv视频文件QMediaPlayer_QVideoWidget

    QT实现播放wmv视频文件QMediaPlayer_QVideoWidget QT实现播放wmv视频文件QMediaPlayer_QVideoWidget.rar-QT文档类资源-CSDN下载QT实现 ...

  8. 【Qt+FFmpeg】鼠标滚轮放大、缩小、移动——解码播放本地视频(三)

    上一期我们实现了播放.暂停.重播.倍速功能,这期来谈谈如何实现鼠标滚轮放大缩小和移动:如果还没看过上期,请移步 [Qt+FFmpeg]解码播放本地视频(一)_logani的博客-CSDN博客[Qt+F ...

  9. QT播放视频QMediaPlayer

    pro文件添加QT +=multimedia multimediawidgets: UI界面拖拽一个QWidget,右键提升为QVideoWidget: 定义QMediaPlayer对象 QMedia ...

  10. 【Qt 开源音视频框架模块QtAV】02:QTAV多功能播放器

    前言 在[Qt 开源音视频框架模块QtAV]01:介绍.编译以及简单使用中我们已经完成了QTAV的项目部署和简单案例的测试,下面我再分享下QTAV提供的播放器例程. 程序功能效果展示 演示的项目在QT ...

最新文章

  1. ThinkPad -- Intel 无线网卡网络连接方法限制及无法用 Fn + F5 控制的问题
  2. 7.1.1 [Enterprise Library]缓存应用程序块场景和目标
  3. C语言项目:图形马赛克处理技术
  4. 初学者选黑卡还是微单_明日之镜 十年索尼微单和他的镜头王国
  5. java与sql2005连接数据库_Java链接数据库SQl Server2005
  6. 笨办法学 Python · 续 练习 44:使用 Python 的数据库 API
  7. linux 多进程 同步,Linux内核同步,进程,线程同步
  8. SpringMVC多拦截器的执行
  9. 崩溃的数据库字符集问题
  10. 个人对stacking的思想理解
  11. python图灵机器人怎么退出_python调用图灵机器人实现微信自动回复
  12. 第二季-专题20-移植bootm命令启动内核
  13. 多看系统下载_制冷系统压力检测有多重要?看了你就知道了
  14. 联想服务器修改mac,修改Thinkpad E420的无线网卡MAC地址?
  15. 方舟服务器制作修改,方舟生存进化服务器模式设置教程
  16. wine: /home/cpr/.wine is not owned by you
  17. 常用软胶材料基本知识
  18. 质因数分解,(结果简化版)
  19. php 表示什么,php是什么意思
  20. 推荐5款让你相见恨晚的神级软件,把把直击心灵

热门文章

  1. js获取ip地址的私有地址 或者公有地址
  2. 解决XeLaTex编译后中文出现乱码的问题
  3. recipe terminated with fatal error: spawn xelatex enoent.
  4. gensim lda文本无监督分类实现 (有代码)
  5. Junipor交换机 HAS BOOTED FROM THE BACKUP JUNOS IMAGE
  6. 自回归模型 java_Eviews的ARIMA(差分自回归移动平均模型)模型入门操作指南
  7. rollup分析函数
  8. 一张图读懂中国产业链的变化与机会
  9. IT成长日记(二)——联想打印机
  10. linux CPU压力测试stress