defaultServiceProvider::requestService(): no service found for - "org.qt-project.qt.mediaplayer"
开发环境:
ubuntu14.04.5
QT5.9.1
需求:
在ubuntu中实现qt播放MP3或者WAV音频文件
问题:
和开头的报错一样,只要大家搜索到这个报错,基本上搜不到相应的linux环境解决方法,网上只有windows的解决方案。经过多次尝试、甚至重新安装gstreamer1.0都不行
gstmreaer:
一个Linux环境下的音乐播放器,qt代码中的播放音频部分需要引用他的库multimedia。
当我们在Pro文件中添加了它之后,我们要使用它的带的QMediaPlayer类,代码很简单,就几行。
QMediaPlayer *musicPlayer = new QMediaPlayer();
musicPlayer->setMedia(QUrl::fromLocalFile(绝对路径));
musicPlayer->setVolume(80);
musicPlayer->play();
正常编译后应该能够播放音乐的,但是这时遇到了文章开头的报错,网上现存的解决方法都没有用,经过研究,确定是QT没有找到gstreamer1.0的运行库。顺便解释一下,为什么是gstreamer1.0。
ubuntu14自带gstreamer是0.1版本的,qt5的官方文档中指出gstreamer的版本需要大于等于1.0,所以我们要重新安装新版gstreamer1.0,而且所谓的“1.0”是一个泛指,我这里用的是1.6版本,他最后生成的库的名字还是以1.0命名,所以下面看到1.6版本不要有疑惑,那是对的。
因上原因,我们现在安装gstreamer1.6,这里使用手工编译安装的方式安装。
这里参考https://blog.csdn.net/yibinqi6303/article/details/78984007这位作者的安装方式
或者查看我的备份
其中遇到些问题,
1.新安装的系统没有安装GCC和Cmake,自行百度安装
2.安装过程中会有依赖问题,通过aptitude软件解决依赖问题
sudo apt-get install -y aptitude
3.关于输出文件路径,我们在这里新建一个文件,路径为
/home/用户名/Downloads/gstreamer-1.0
用来存储编译成功后输出的运行库文件,也就是QT5所需的高版本运行库的最终引用路径
安装:
我们需要这几个文件,去这里下载。
● gstreamer-1.6.0.tar.xz
● gst-plugins-base-1.6.0.tar.xz
● gst-plugins-good-1.6.0.tar.xz
● gst-plugins-bad-1.6.0.tar.xz
● gst-plugins-ugly-1.6.0.tar.xz
我们统一存在同一个路径下面:/home/用户名/Downloads/gstreamer-dl
下载成功后均在上面这个目录下解压,解压出来的效果是这样的
我们需要在这五个文件夹中都执行同样的操作
1.配置编译安装完成后的输出路径,即为上面提到的 /home/用户名/Downloads/gstreamer-1.0
2.make
3.make install
补充,有的编译过程之前需要安装开发环境。
sudo apt-get install build-essential dpkg-dev flex bison autotools-
dev automake liborc-dev autopoint libtool gtk-doc-tools
libgstreamer1.0-dev 这个安装过程是没问题的
sudo apt-get install libxv-dev libasound2-dev libtheora-dev libogg-
dev libvorbis-dev这个也没问题
sudo apt-get install libbz2-dev libv4l-dev libvpx-dev libjack-
jackd2-dev libsoup2.4-dev libpulse-dev这里和系统自带的版本有冲突
需要先安装aptitude,然后通过aptitude命令重新安装
sudo aptitude install libbz2-dev libv4l-dev libvpx-dev libjack-
jackd2-dev libsoup2.4-dev libpulse-dev
无脑yes即可,后面的同理安装。
sudo aptitude install faad libfaad-dev libfaac-dev
需要注意的是,我的安装顺序均按原作者的安装顺序,先编译主程序gstreamer-1.6.0(编译完后记得设置环境变量export PKG_CONFIG_PATH=/home/用户名/Downloads/gstreamer-1.0/lib/pkgconfig),再编译各个插件,顺序为base、good、bad、ugly。
最后再添加一个环境变量export LD_LIBRARY_PATH=/home/用户名/Downloads/gstreamer-1.0/lib/
到这里我们的gstreamer环境已经搞定了,我们继续搞定QT引用外部运行库的问题。
前面已经分析过QT之所以报错:defaultServiceProvider::requestService(): no service found for - "org.qt-project.qt.mediaplayer" 是因为没有找到外部库的路径,我们通过Pro文件的官方解释,通过LIBS += -L/home/用户名/Downloads/gstreamer-1.0/lib/ -lgstreamer-1.0添加外部库的地址。
这里为什么这么写呢,因为官方语法是这么规定的!其中-L后面紧跟路径,不能有空格,-l后面紧跟库名,不能有空格。这里有几个细节,编译过程中会有类似提示(因为文章是事后写的,图没有原版的,找了个类似的,而且文中命令都是手写的,难免会有错误,请及时告知作者)
我们可以看到他的本质是调用了gcc命令的-L方式,语法是这样的,-L后紧跟路径,-l后紧跟库名,当有多个库需要加载的时候以空格隔开,库名不要带后缀(windows下),linux下需要注意代码不要带前缀的lib和后缀的so,所以库名部分的命令这么写“-lgstreamer-1.0”,其实库名是“libgstreamer-1.0.so”!
这时候再去qt环境中,清空一下项目,重新编译看看,是不是能够愉快的播放音频了。如果不行考虑一下是不是mp3或者wav格式不对,都试下,我只试了wav可用,mp3不保证可用。再考虑一下qt代码中音频文件的地址是不是写对了。最后再仔细看看是不是哪里漏掉了。