根据搜索引擎的结果,要想实现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过高问题的更多相关文章

  1. memcache占用CPU过高的解决办法

    Simon最近为公司服务器操碎了心 , 先是mysqld进程占用CPU过高 , 导致服务器性能变低 ,网站打开太慢.通过增加max_connections及table_cache解决了问题 ,随后发现 ...

  2. 再记一次w3wp占用CPU过高的解决过程(Dictionary和线程安全)

    在此之前项目有发生过两次类似的状况,都得以解决,但最近又会发现偶尔CPU会跑满,虽然之前使用过WinDbg解决过两次问题但人的记忆是不可靠的,今天处理同样问题的时候还是遇到了一些障碍,这一次希望可以记 ...

  3. w3wp占用CPU过高

    w3wp占用CPU过高 在此之前项目有发生过两次类似的状况,都得以解决,但最近又会发现偶尔CPU会跑满,虽然之前使用过WinDbg解决过两次问题但人的记忆是不可靠的,今天处理同样问题的时候还是遇到了一 ...

  4. JVM进程占用CPU过高问题排查

    上午收到报警,某台机器上的CPU负载过高,通过逐步的排查,解决了问题,下面记录一下整个排查的过程. 首先,登录上对应的机器,通过top命令找到占用CPU过高的进程ID,也就是PID,为29126, 然 ...

  5. 关于linux系统CPU篇--->不容易发现的占用CPU较高进程

    1.系统的CPU使用率,不仅包括进程用户态和内核态的运行,还包括中断处理,等待IO以及内核线程等等.所以,当你发现系统的CPU使用率很高的时候,不一定能找到相对应的高CPU使用率的进程 2.案例分析, ...

  6. 查找linux下进程占用CPU过高的原因,以php-fpm为例

    很多时候,线上服务器的进程在某时间段内长时间占用CPU过高,为了优化,我们需要找出原因. 1.找出占用CPU最高的10个进程 ps aux | sort -k3nr | head -n 10 或查看占 ...

  7. Mysql占用CPU过高如何优化?(转)

    原文:http://bbs.landingbj.com/t-0-241441-1.html MySQL处在高负载环境下,磁盘IO读写过多,肯定会占用很多资源,必然CP会U占用过高. 占用CPU过高,可 ...

  8. Mysql占用CPU过高如何优化,如何解决

    2017-02-28 15:13 331人阅读 评论(0) 收藏 举报   MySQL占用CPU过高如何优化 一次生产DB服务器的 超负荷运行问题解决: 1.查看生产DB服务器top列表, 执行 to ...

  9. Linux排查Java程序占用CPU很高的解决办法

    Java的工具集相当强大,学习成本也很低,处理线上问题时,jstack这个工具就比微软的windbg,好学好用很多,3步找出占用CPU很高的源所在.而windbg反人类的各种命令,实在不敢恭维. 故意 ...

随机推荐

  1. 多因子降维法(MDR,multifactor dimensionality reduction)

    多因子降维法(MDR,Multifactor Dimensionality Reduction ) MDR是近年统计学中发展起来的一种新的分析方法.其中,“因子” 即交互作用研究中的变量,“维” 是指 ...

  2. 使用布局(Layout资源)

    实际上从我们学习第一个Android应用开始,已经开始接触Android的Layout资源了,因此此处不会详细介绍Android Layout资源的知识,会对Layout资源进行简单的归纳. Layo ...

  3. 关于自己封装Web前端框架的思考和探索

    一.引言 首先这些年关于前端技术层出不穷,从最早的只用js做简单验证,到现在发现好像大前端已经无所不能了的感觉.特别是为了降低前端开发复杂度,涌现了一大批 的MVC/MVVM模式的前端框架,不停了刷新 ...

  4. Android4.0新增的网格布局

    网格布局由GridLayout代表,它是Android 4.0新增的布局管理器,因此需要在Android 4.0 之后的版本中才能使用该布局管理器.如果希望在更早的Android平台上使用该布局管理器 ...

  5. bootstrap 按钮 文本 浮动 隐藏

    bootstrap 按钮 文本 浮动 隐藏 <!DOCTYPE html> <html lang="en"> <head> <meta c ...

  6. 负载均衡软件LVS分析四(测试)

    一.启动LVS集群服务LVS负载均衡管理和使用有两种方式,一种是以ipvsadm命令行脚步与ldirectord监控方式,一种是以Piranha工具进行管理和使用.下面分别介绍. 1.利用ipvsad ...

  7. SoapUI:mock service的使用

    mock service就是服务模拟,当我们的接口完成而服务端还没完成的时候,我们就可以用mock service来替代服务端进行接口测试. 1.1       创建MockService 创建moc ...

  8. 如何利用express新建项目(上)

    如何利用express新建项目(上) 摘要 这篇文章将讲解了如何快速利用express新建项目 一.express4.x的安装 1. npm install -g express 2. npm ins ...

  9. Hadoop权威指南:HDFS-写入数据

    Hadoop权威指南:HDFS-写入数据 FileSystem类有一系列的新建文件的方法.最简单的方法是给准备建的文件指定一个Path对象,然后返回一个用于写入数据的输出流: public FSDat ...

  10. oracle sql 知识小结

    Oracle_sql : 第一单元:select 语句: ①:字符串连接操作符: || ②:去除重复行:distinct   第二单元:条件限制和排序 ①:关键字:where ②:比较操作符:=,&g ...