本文是关于基于QMediaPlayer的播放器的总结,一开始我的想法就是想用opencv做一个视频播放器,因为opencv平时用的也比较顺手,但是花了半天的时间实际一做才知道事情没那么简单,首先使用opencv加载本地视频文件到界面上就花了不少时间,在使用qt播放opencv传过来的视频的时候播放的基本原理还是没变,仍然是一帧一帧的连续输出就形成了视频。但是这个地方有好几个要注意的地方,首先,opencv自带的waikey函数在qt里面不能用,因为本身waikey函数在opencv播放视频时是用来设置帧间的时间间距的,此时必须要根据视频的帧率来设置帧数之间的时间间隔;其次,waikey函数在opencv中使用习惯了没注意到,这个函数本身是和其他函数配合起到持续输出帧数的作用,在输出的过程中必须有。。。(这个地方忘了,先搁置一下);因此如果直接在qt中使用这个函数的话会出现没有画面的情况,为此,我们需要选用qt里面的Qtimer控件,进行输出间隔的控制,然后还是根据视频的帧数设置输出间隔。以上工作都搞得差不多了之后,我发现了一个最操蛋的事,这样使用opencv输出来的视频是没有声音的!前前后后搞了一个下午,浪费了不少时间,但是也算是加深了对opencv进一步的了解了吧。

通过网上的查阅和与师兄的沟通发现,原来做视频播放器的库有很多,包括qt自带的QMediaPlayer、ffmpeg等等,本来听说ffmpeg还不错,但是一到官网一看没有直接的安装包,心想还是用qt自带的库吧。下面是我在使用QMediaPlayer过程中遇到的一些困难和解决问题的办法。
由于我是qt初学者,对qt中的很多机制还不是特别的了解,但是通过做了这么一个小例子,我把基本的一些问题都搞的比较清楚了,最起码后面再碰到大部分问题时心里有个方向了。
首先是Qtimer这个控件的使用上,之前对槽与信号了解的也不是很深,以为大部分槽都可以在界面上找到,但是我这个项目做的越深越发现原来很多界面的设置可以用代码实现,一旦用了代码就不能简单的使用界面一点直接跳转的方式来写槽与信号了。我对信号的理解就是,信号本身就是一个函数,但是不能被定义,并且要在头文件里用signals关键字指出,信号不能有返回值,它仅代表在某个控件或窗体上出发了某个东西,然后由信号就会产生对应的槽函数,槽函数是和普通函数没太大差别的函数,它本身要以关键字slots在头文件中指出,在定义的时候可以写入任意的操作。并且信号与槽机制在子窗体和父窗体的值的传递中起着重要作用,可以使用槽与信号实现父窗体传值到子窗体,也可以实现子窗体传值到父窗体,也就是说,有了槽与信号,可以很灵活的控制子父窗体数据之间的联系。Qtimer这个控件的大部分使用都是和信号与槽结合在一起的,connect(timer,SIGNAL(timeOut()),this,SLOT(on_timeout()));通过初始化一个timer并且设置其时间间隔,以毫秒为单位,之后每过一个时间间隔,就会发出一个信号使槽函数开始运行,知道设置timer.stop(),信号停止发送。因此利用QTimer这个控件可以实现很多定时操作。在这个项目里面主要是用来设置当播放视频全屏时鼠标悬浮一段时间之后自动隐藏,然后在鼠标移动之后重新出现鼠标指针,但是这个地方有个问题,鼠标移动必须按住任意一个按键才能使指针显示出来,并且我使用的就是MouseMoveEvent(),这个问题目前还没解决。
然后就是界面的布局上,之前对qt的界面布局很迷,因为一开始学习编程时接触了一段时间的C#,C#的界面布局感觉要简单很多,但是这么几天我发现其实qt的布局也很方便,一旦理解了就很容易做出来比较好看的布局。关于布局第一点是五种布局方式,垂直、水平、栅格、群组等,在布局的时候我发现视频和控制按钮得分割开,我一开始是不知道用什么方式的,后来在网上一查,可以使用QSplitter进行分割,QSplitter也是控件,并且是由分割线和本体组成的,分割线的粗细和颜色都可以自定义设置,但是粗细只能是整数,因此无法设置小于一的线宽,一般默认情况下Qsplitter的分割线是可以被移动的,但是也可以通过设置分割线的属性值setEnabled来设置其不可调整比例,主要用法如下
QSplitterHandle *pHandle = splitter->handle(1); pHandle->setEnabled(false); pHandle->setStyleSheet("background-color:rgba(0,48,77,0.7)"); QSplitterHandle *cHandle = splitter_video->handle(1); cHandle->setEnabled(false); cHandle->setStyleSheet("background-color:rgba(0,48,77,0.7)");
主要就是通过获取splitter的handle值来单独设置,网上很多说可以利用setOpaque函数的值来设置的,我始终没设置成功,最终就是用的上述方法来设置的。此外关于splitter的一点就是初始比例如果不设置的话就是默认的1:1,在某些情况下自己设置的比例如果不生效就会自动采用默认比例。我这个项目里主要用到了两个splitter,所以在分割的时候一定注意比例的问题,当时一开始我怎么设置都不生效,后来我发现对于QMainWindow本身要设置一个主窗体,因为中间的窗口很多,会涉及到冲突的问题,我的做法是用一个最大的splitter设置为窗体的主窗体,然后其他所有的布局都在这上面进行,在布局的时候还遇到了一个问题,就是涉及到控件的嵌套布局方式,当对多个控件使用组合布局时一定不要先设置父窗体指针,要在最后一个布局上设置才会生效。
`QHBoxLayout *hbLayoutCtrl = new QHBoxLayout();
hbLayoutCtrl->addWidget(labelTime);
hbLayoutCtrl->addStretch();
hbLayoutCtrl->addStretch();
hbLayoutCtrl->addStretch();
hbLayoutCtrl->addWidget(btn_stop);
hbLayoutCtrl->addWidget(btn_previous);
hbLayoutCtrl->addWidget(btn_play);
hbLayoutCtrl->addWidget(btn_next);
hbLayoutCtrl->addWidget(btn_volume);
hbLayoutCtrl->addWidget(audio_slider);
hbLayoutCtrl->addStretch();
hbLayoutCtrl->addStretch();
hbLayoutCtrl->addWidget(btn_fullScreen);
hbLayoutCtrl->addWidget(btn_hidePlayList);
//进度条的设置 涉及到多个布局混合的方式,一定要在最终的布局里面再设置父窗口指针
slider->setOrientation(Qt::Horizontal);
slider->setVisible(false);
audio_slider->setOrientation(Qt::Horizontal);
QHBoxLayout *hbSliderLayout = new QHBoxLayout();
hbSliderLayout->addWidget(slider);

QVBoxLayout *vbLayout = new QVBoxLayout(widget_control);
vbLayout->addLayout(hbSliderLayout);
vbLayout->addLayout(hbLayoutCtrl);
vbLayout->setMargin(0);`
这个地方是两个水平布局然后两个布局作为子布局在新的竖直布局里实现,一开始我指定了每个布局的父窗口指针的位置,后来发现设置之后根本不生效,后面查了好多资料才发现在多个布局中一定只能在最后的一个布局里面设置父窗口指针,否则就不生效。
在搞这个东西的时候我还发现对qt外观格式的设置,即qss文本设置qt上各种元素的样式,这个后续再展开说。

使用QT编写视频播放器总结相关推荐

  1. Qt编写视频播放器(vlc内核)

    在研究qt+vlc的过程中,就想直接做个播放器用于独立的项目,vlc还支持硬件加速,不过部分电脑硬件不支持除外.用vlc的内核写播放器就是快,直接调用api就行,逻辑处理和ui展示基本上分分钟的事情, ...

  2. Qt编写视频播放器(支持pbonon/qmediaplayer/ffmpeg/vlc/mpv等多种内核)

    一.前言 花了一年多的时间,终于把这个超级播放器做成了自己想要的架构,用户的需求是一方面,自己架构方面的提升也是一方面,最主要是将界面和解码解耦了,这样才能动态的挂载不同的解码内核到不同的视频监控窗体 ...

  3. java如何开发视频软件_使用JAVA编写视频播放器

    Java因其跨平台优势而陷入困境. 当时,我以为"写一次,到处跑". 这听起来不错,它应该是所有语言开发的最终方法. Java必将统治世界. 事实证明当时我还太小. 所谓的鱼和熊掌 ...

  4. Qt FFmpeg视频播放器开发(八):播放器UI改造、高仿QQ影音

      最近把播放器项目进行了更新,决定参照QQ影音的界面进行实现,我现在的实现如下:   下图是真实的QQ影音   相比QQ影音界面,我的实现有一定的差距,主要是控件的配色,以及中间那个动态图,由于没有 ...

  5. QML+Qt音视频播放器

    代码地址 xyygudu/Player: Qt和QML实现了视频播放器和音乐播放器 (github.com) 部分效果展示 实现的功能 视频相关:播放暂停.播放进度调节.音量调节.列表显示指定目录下的 ...

  6. QT视频播放器(windows qt、linux qt 音视频播放器)

    想要更多项目私wo!!! 一.项目简介        这是基于Qt的QMediaPlayer实现的音视频播放器,实现了播放器的常用功能,例如根据播放列表选择播放的音视频,拖动滑块控制音视频播放. 二. ...

  7. FFmpeg+SDL,如何用少于1000行代码编写视频播放器

    此文档翻译国外dranger教程: An ffmpeg and SDL Tutorial or How to Write a Video Player in Less Than 1000 Lines ...

  8. Qt FFmpeg视频播放器开发(二):FFmepg基本使用与视频播放

    本篇博客目标:读帧解码显示视频 开始进入ffmepg的开发之旅.音视频的细节知识不统一讲解,我在教程中逐点渗透,容我以雷神的话开篇. 视频播放器播放一个互联网上的视频文件,需要经过以下几个步骤:解协议 ...

  9. Qt+Mplayer视频播放器

    用到的工具: Qt5.5.1,msvc2012编译器,Mplayer on windows视频解码器,32位操作系统. 效果图: Qt控制Mplayer的slave模式,Qt负责貌美如花,Mplaye ...

  10. java编写视频播放器_基于Java的视频播放器可以足够快吗?

    第三次谷歌搜索"视频播放java"似乎相关: http://blog.pirelenito.org/2008/08/java-movie-playback-jogl-fobs4jm ...

最新文章

  1. spring boot 启动不连接数据库
  2. Mapreduce 任务提交源码分析1
  3. 视频直播技术详解(5)延迟优化
  4. Python基础-面向对象编程
  5. linux系统python 2.6 安装pip_详解CentOS升级Python2.6到Python2.7并安装pip
  6. Mybatis的全局配置文件中的标签
  7. lvs负载均衡—ldirectord(DR模式的健康检查)
  8. spring boot: Whitelabel Error Page的解决方案 --转载https://blog.csdn.net/sinat_31270499/article/details/822
  9. 谷歌翻译退出中国,官方因其使用率过低
  10. 重装系统显示缺少计算机所需的介质驱动程序,安装WIN7提示“缺少所需的CD/DVD驱动器设备驱动程序”的解决办法...
  11. 计算机科学的拉丁文,拉丁字母A-Z在计算机中对应的二进制编码
  12. Centos7 切换为163 网易yum
  13. C语言程序设计笔记(浙大翁恺版) 第七章:函数
  14. Android利用SpannableStringBuilder设置TextView中部分文字的颜色...
  15. VS2019c++配置GDAL和HDF库新手入门
  16. 实至名归,凯联资本荣获融资中国第十一届资本年会多项荣誉
  17. java千克和磅之间的转换,进行打印
  18. 纽约州立大学水牛城分校计算机科学专业,纽约州立大学水牛城分校
  19. 疯狂android讲义第4版光盘_卧槽!当当网又又又可以 4 折买书了!!跟我一起薅羊毛了!...
  20. 【ChatGPT】中国支付清算协会倡议支付行业从业人员谨慎使用ChatGPT

热门文章

  1. win10音响左右声道测试软件,win10左右声道不分的三种解决方法【图文】
  2. 后台管理系统PRD该怎么写?
  3. 计算机毕业论文性能测试怎么写,计算机毕业论文撰写技巧
  4. mcgs组态软件中字体如果从左到右变化_在MCGS嵌入版组态软件中,可以利用大小变化来实现动画效果。( )...
  5. 数论1.0 数论基础
  6. 【CFD学习】yplus,y+,边界层理论,壁面第一层网格
  7. xv6源码阅读——xv6的启动,进程初识
  8. 二维旋转矩阵公式推导
  9. snap7/Qt/ros-------ubantu14.04下杂记
  10. 总结之lowagie.text合并PDF文件