QMediaPlayer占用CPU过高问题
根据搜索引擎的结果,要想实现QT下播放多媒体,一般有两种方案:一种是使用第三方插件,好像叫Phonon;一种是使用QT自带的QMediaplayer。
两种方法各有利弊。使用第三方插件,则方便易用,封装性和易用性都很突出,但是,它万一不更新了,就成了一笔坏账了;而使用QT自带的QMediaplayer,可以享受QT团队的持续升级和支持,但是这个特性据说是5.0版本才引入和被支持的。
项目使用的QT版本为5.4.2,所以,果断采用QMediaPlayer。
实现功能:就是使用QT播放指定声音,且让该声音循环播放。
最初实现方案如下:
/* 定义需要使用的媒体相关的变量 */
QMediaPlayer* m_mpLoop;
QMediaPlaylist* m_mplistLoop;
const QString s_strLoopFileName;/* 声音文件名称 */
m_mpLoop = new QMediaPlayer;
m_mplistLoop = new QMediaPlaylist;
初始化代码
/* High CPU Usage code */
bool MyClass::InitMediaPlayer(QString strDataFileName, QMediaPlayer* const pstMediaPlayer,
QMediaPlaylist* const pstPlaylist)
{
bool bRet = false;
if (NULL != pstMediaPlayer && NULL != pstPlaylist)
{
bRet = true;
/* s_strDataLoc表示当前音乐文件所在文件夹路径(绝对路径或相对路径均可) */
QFileInfo stFileInfo(s_strDataLoc + strDataFileName);
/* 先往列表中添加媒体文件 */
pstPlaylist->addMedia(QUrl::fromLocalFile(stFileInfo.absoluteFilePath()));
/* 设置播放列表中当前项的索引 */
pstPlaylist->setCurrentIndex(0U);
/* 设置当前列表的播放方式为单曲循环 */
pstPlaylist->setPlaybackMode(QMediaPlaylist::CurrentItemInLoop);
/* 将建好的播放列表与相应的播放器关联起来 */
pstMediaPlayer->setPlaylist(pstPlaylist);
/* 可以设置当前播放器的音量大小百分比 */
pstMediaPlayer->setVolume(70);
}
return bRet;
}
采用如下方式调用:
/* 初始化播放列表 */
InitMediaPlayer(s_strLoopFileName, m_mpLoop, m_mplistLoop);
这样调用之后,发现问题就出来了。在我的电脑上CPU占用率很低,在别人的某些电脑上CPU占用率异常的高,简直不能忍受,什么鬼~~~
直觉告诉我,罪魁祸首一定是设置单曲循环的地方!怎么办呢?无从下手啊,并不知道这个为什么某些高,某些不高,sigh~
不用它现成的东西,我只能另辟蹊径了~
看到这个类自带以下的Signals和Slots,我决定从它们下手!
Slots
void play()
void setMuted(bool muted)
void setPosition(qint64 position)
void setVolume(int volume)
void stop()
Signals
void positionChanged(qint64 position)
void mediaStatusChanged(QMediaPlayer::MediaStatus status)
那么问题来了,到底捕捉positionChanged事件呢,还是捕捉mediaStatusChanged事件呢?position变化太频繁,到时候CPU还是可能会很高的,那么还是选用mediaStatus吧!
OK!那就捕捉mediaStatusChanged的事件,查看自带定义的媒体文件状态定义如下:
| Constant | Value | Description |
|---|---|---|
| QMediaPlayer::UnknownMediaStatus | 0 | The status of the media cannot be determined. |
| QMediaPlayer::NoMedia | 1 | The is no current media. The player is in the StoppedState. |
| QMediaPlayer::LoadingMedia | 2 | The current media is being loaded. The player may be in any state. |
| QMediaPlayer::LoadedMedia | 3 | The current media has been loaded. The player is in the StoppedState. |
| QMediaPlayer::StalledMedia | 4 | Playback of the current media has stalled due to insufficient buffering or some other temporary interruption. The player is in the PlayingState or PausedState. |
| QMediaPlayer::BufferingMedia | 5 | The player is buffering data but has enough data buffered for playback to continue for the immediate future. The player is in the PlayingState or PausedState. |
| QMediaPlayer::BufferedMedia | 6 | The player has fully buffered the current media. The player is in the PlayingState or PausedState. |
| QMediaPlayer::EndOfMedia | 7 | Playback has reached the end of the current media. The player is in the StoppedState. |
| QMediaPlayer::InvalidMedia | 8 | The current media cannot be played. The player is in the StoppedState. |
那么只需要捕捉EndOfMedia这个状态就好了,到时候播放完了,就setPosition到0的位置,那么不就settled了么?
部分实现代码如下:
void MyClass::SlotProcMediaStatusChangeLoop(QMediaPlayer::MediaStatus status)
{
if (status == QMediaPlayer::EndOfMedia)
{
emit setPosition(0);/*设置初始位置为0*/
emit play();/*继续播放*/
}
}
Finally,经过我的实验验证,无论是在我的电脑,还是在同事的电脑上,CPU占用率都降下来了!Settled!Nice!
QMediaPlayer占用CPU过高问题的更多相关文章
- memcache占用CPU过高的解决办法
Simon最近为公司服务器操碎了心 , 先是mysqld进程占用CPU过高 , 导致服务器性能变低 ,网站打开太慢.通过增加max_connections及table_cache解决了问题 ,随后发现 ...
- 再记一次w3wp占用CPU过高的解决过程(Dictionary和线程安全)
在此之前项目有发生过两次类似的状况,都得以解决,但最近又会发现偶尔CPU会跑满,虽然之前使用过WinDbg解决过两次问题但人的记忆是不可靠的,今天处理同样问题的时候还是遇到了一些障碍,这一次希望可以记 ...
- w3wp占用CPU过高
w3wp占用CPU过高 在此之前项目有发生过两次类似的状况,都得以解决,但最近又会发现偶尔CPU会跑满,虽然之前使用过WinDbg解决过两次问题但人的记忆是不可靠的,今天处理同样问题的时候还是遇到了一 ...
- JVM进程占用CPU过高问题排查
上午收到报警,某台机器上的CPU负载过高,通过逐步的排查,解决了问题,下面记录一下整个排查的过程. 首先,登录上对应的机器,通过top命令找到占用CPU过高的进程ID,也就是PID,为29126, 然 ...
- 关于linux系统CPU篇--->不容易发现的占用CPU较高进程
1.系统的CPU使用率,不仅包括进程用户态和内核态的运行,还包括中断处理,等待IO以及内核线程等等.所以,当你发现系统的CPU使用率很高的时候,不一定能找到相对应的高CPU使用率的进程 2.案例分析, ...
- 查找linux下进程占用CPU过高的原因,以php-fpm为例
很多时候,线上服务器的进程在某时间段内长时间占用CPU过高,为了优化,我们需要找出原因. 1.找出占用CPU最高的10个进程 ps aux | sort -k3nr | head -n 10 或查看占 ...
- Mysql占用CPU过高如何优化?(转)
原文:http://bbs.landingbj.com/t-0-241441-1.html MySQL处在高负载环境下,磁盘IO读写过多,肯定会占用很多资源,必然CP会U占用过高. 占用CPU过高,可 ...
- Mysql占用CPU过高如何优化,如何解决
2017-02-28 15:13 331人阅读 评论(0) 收藏 举报 MySQL占用CPU过高如何优化 一次生产DB服务器的 超负荷运行问题解决: 1.查看生产DB服务器top列表, 执行 to ...
- Linux排查Java程序占用CPU很高的解决办法
Java的工具集相当强大,学习成本也很低,处理线上问题时,jstack这个工具就比微软的windbg,好学好用很多,3步找出占用CPU很高的源所在.而windbg反人类的各种命令,实在不敢恭维. 故意 ...
随机推荐
- 神经网络NN
神经网络基本模型: 1.前向神经网络:无圈的有向图N=(V,E,W),其中,V为神经元集合,E为连结权值集合,W为每一连结赋予一实值的权重. 神经元集V可以被分成无接受域的输入结点集V1,无投射域的输 ...
- Angular - - ngList、ngRepeat、ngModelOptions
ngList 在文本输入的分隔的字符串和字符串数组间做转换,可以是一个固定的字符串分隔符(默认逗号)或正则表达式. 格式:ng-list=”value” value:表达式 通过这个值分隔字符串. ...
- Angular - - $http请求服务
$http $http是Angular的一个核心服务,它有利于浏览器通过XMLHttpRequest 对象或者 JSONP和远程HTTP服务器交互. $HTTP API 是基于 $q服务暴露的defe ...
- JQuery flot API文档 中文版
调用plot函数的方法如下: var plot = $.plot(placeholder, data, options) 其 中placeholder可以是JQuery的对象,DOM元素或者JQuer ...
- JQuery动画animate的stop方法使用详解
JQuery动画animate的stop方法使用详解 animate语法: 复制代码 代码如下: $(selector).animate(styles,speed,easing,callback) 复 ...
- --@angularjs-- $location.path('/login')-$location服务用法示例
$httpProvider interceptor .factory('auth403', ['$rootScope', '$q', '$location', function auth403($ro ...
- JavaScript成员属性读取
var obj = {}; 检索一个不存在的成员属性的值,将返回undefined; 可以使用||运算符来填充默认值: var status = obj.status||'inistatus' 从un ...
- xmlns:xsi ——是指xml文件遵守xml规范,xsi全名:xml schema instance
http://blog.sina.com.cn/s/blog_4b6f8d150100nx3e.html http://blog.csdn.net/iaiti/article/details/4226 ...
- [linux]ngrep命令、常见用法
1.ngrep命令 ngrep命令是grep命令的网络版,ngrep用于搜寻指定的数据包(抓包.过滤).能识别TCP.UDP和ICMP包,理解bpf的过滤机制. 1.1 安装 brew install ...
- POJ3728 LCA RMQ DP
题意简述:给定一个N个节点的树,1<=N<=50000 每个节点都有一个权值,代表商品在这个节点的价格.商人从某个节点a移动到节点b,且只能购买并出售一次商品,问最多可以产生多大的利润. ...