首先,要使用Qt的媒体类,也就是QMediaPlayer对象。
QMediaPlayer是Qt提供的一个跨平台媒体播放器类。该类,在Windows下时,底层基于微软的DirectShow框架实现;在Linux下时,底层基于GStreamer框架实现。
也就是说,Qt没有直接使用解码库,而是对平台相关的播放器框架做了封装,提供了平台无关的API。
前提条件
环境:Qt5.15
要使用QMediaPlayer这个类,得在pro文件中添加
QT += multimedia
代码
相对路径播放mp3
然后,我们可以添加以下代码:
QMediaPlayer *player = new QMediaPlayer;
//添加音乐列表
QMediaPlaylist *musicList = new QMediaPlaylist;
//添加音乐列表
musicList->addMedia(QMediaContent(QUrl::fromLocalFile("./music/background_music.mp3")));
player->setPlaylist(musicList);
player->setVolume(80); //音量
player->play();
注意,这里加载mp3音乐文件使用的是相对路径。
资源文件播放mp3
如果把mp3加入qrc资源文件的话,需要改成这样的语句才能正常播放
musicList->addMedia(QMediaContent(QUrl("qrc:/music/background_music.mp3")));
编译运行
使用资源文件添加的朋友应该能马上听到声音。但是使用相对路径的朋友,可能没有声音。为什么呢
问题排查
问题一
编译运行,可以在应用程序输出
这里看到一条信息:
DirectShowPlayerService::doSetUrlSource: Unresolved error code 0x80070003
这个是什么原因呢?
有两个原因
原因一:
因为,你没把音乐文件放到正确的路径下。
注意了,这里又有一个小坑。
如果你使用的是
musicList->addMedia(QMediaContent(QUrl::fromLocalFile("./music/background_music.mp3")));
那么你想在Qt里面能听到声音,就需要将music文件夹放到和debug,release文件夹同级路径下。如图:
如果使用的是
musicList->addMedia(QMediaContent(QUrl::fromLocalFile(QApplication::applicationDirPath() + "/music/background_music.mp3")));
那就得放到exe所在路径下。
原因二
需要额外安装解码器,QMediaPlayer才能正常工作(我使用的是Qt 5.15,测试不需要)
建议安装LAVFilters,下载地址:https://github.com/Nevcairiel/LAVFilters/releases
安装完成后,建议重新构建一下。
问题二
如果出现以下错误,意思就是没有找到相应的库
defaultServiceProvider::requestService(): no service found for - "org.qt-project.qt.mediaplayer"
将Qt安装目录下的plugins下的mediaservice文件夹拷到运行目录下。比如我这里的Qt路径D:\Qt\5.15.2\msvc2019\plugins
问题三
如果使用windeployqt打包后,运行exe程序没声音,检查生成的文件中有没有mediaservice
文件夹,如果没有就如问题二一样,把此文件夹拷贝到打包路径下。
如果有这个文件夹,但还是没声音,试着创建plugins
文件夹,再把mediaservice文件夹放进去,如图:
最后的最后
由于不同Qt版本,不同编译器(MSVC,MinGW),都有各种原因可能造成这些问题。这里没法一一测试。