Qt 使用QMediaPlayer播放音乐无声音

首先,要使用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文件夹同级路径下。如图:
image-20220422113646051

如果使用的是

 musicList->addMedia(QMediaContent(QUrl::fromLocalFile(QApplication::applicationDirPath() + "/music/background_music.mp3"))); 

那就得放到exe所在路径下。

image-20220422114211070

原因二

需要额外安装解码器,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文件夹放进去,如图:

image-20220422130026884

最后的最后

由于不同Qt版本,不同编译器(MSVC,MinGW),都有各种原因可能造成这些问题。这里没法一一测试。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值