1.了解音乐播放器应该有哪些功能:
音乐播放器的各种控制(上下曲,单曲循环,随机播放,顺序播放),歌曲列表,歌词显示,本地音乐保存,在线音乐搜索,在线音乐播放。
2.制作Qt音乐播放器一定要了解QmediaPlayer和QmediaPlaylist。
使用QmediaPlaylist和QmediaPlayer需要工程文件里添加
QT += multimedia network;
QmediaPlaylist:
算是一个音乐链表,将mp3文件以链表形式添加进去。使用QmediaPlayer定义的类进行播放。默认是顺序播放,要想改变播放模式,操作如下:
QmediaPlaylist::setPlaybackMode用来设置播放模式,播放模式有:
循环(QMediaPlaylist::CurrentItemInLoop)、
顺序(QMediaPlaylist::Sequential)、
随机(QMediaPlaylist::Random)等;
由于类似链表,Playlist里面的歌曲都有一个下标(index)。QmediaPlaylist::CurrentIndex函数用来获取当前歌曲的下标,利用index控制播放哪一首歌。
QmediaPlayer:
当使用QmediaPlaylist定义一个Playlist,QmediaPlayer定义一个Player,
Player->setPlaylist(PlayList) 就可以对应Playlist里面的音乐。
再使用Player->play(),进行播放音乐。
QmediaPlayer可以实现简单的功能实现:
音乐暂停:
Player->pause();
音乐播放:
Player->play();
音乐停止:
Player->stop();
关于如何添加本地音乐文件:
通过QFileDialog::getOpenFileNames去过滤文件,通过QDir::currentPath();获取当前文件路径进行初始化,文件过滤器筛选出“*.mp3”。使用for循环和
PlayList->addMedia(QUrl::fromLocalFile(path));逐渐将本地音乐添加到PlayList里面去。再让Player获取PlayList的内容,添加本地音乐算是完成了。
实现上下曲:
前面说过每首歌曲都有一个下标,通过下标可以实现对歌曲的控制。PlayList->currentIndex();可以获取当前歌曲下标,因此定义一个int类型num等于当前歌曲下标+1就可完成下一首操作,当num == PlayList里面总歌曲数时,再把num置零,实现最后一首下一首时转到第一首歌曲。上一首同理。
关于音乐音量的改变:
通过Player->setVolume(vol)改变音量大小;通过信号与槽,滑块滑动获得值vol,就可以实现滑块控制。
关于音乐进度的改变:
获取音乐进度条和改变进度条需要Player发送信号到槽函数。
Player的位置信号SIGNAL(positionChanged(qint64) 获取当前播放位置
Player的进度信号SIGNAL(durationChanged(qint64) 获取总进度
分别连接各自自定义槽函数,信号是播放器自动触发。
音乐播放器的换肤功能:
准备好预先写好的qss文件进行只读操作:
如何写qss文件:
比如QPushButton { color: red }。
QPushButton指定了是对所有的QPushButton或是其子类控件产生影响,而color:red表明所有的受影响控件的前景色都为red。若想单独修改一个控件的样式这需要该控件调用setObjectname,假设定义了一个
QPushButton new;并不是使用new这个对象名,而是通过new->setObjectname (“wc”),QPushButton#wc { color: red }。这样qss就能识别出修改哪个对象。每种控件格式都大致这样,但每个控件都有各自的子控件对象,在对子对象进行样式修改也是类似格式。
本地音乐的保存:
需要使用到QSqlDatabase,使用它需要在工程文件里添加QT += sql;
QSqlDatabase和我们之前学的mysql非常相似。
首先使用它就需要创建它。
通过QSqlDatabase::addDatabase 创建数据库
setDatabaseName("Music.db");设置数据库名字。
在mysql中创好数据库后就是往库里面插入数据表格,
通过定义QSqlQuery query(Database)打开对应数据库,使用query.exec()函数进行表格操作。exec()里面的操作和我们之前学的mysql一模一样。比如
query.exec("CREATE TABLE musicList(id INTEGER primary key AUTOINCREMENT, musicPath varchar, musicName verchar)");
创建一个名叫musicList的表格,id设为主键,musicPath,musicName都为表头,且该列下数据类型为verchar型。有了mysql的基础数据库操作起来是非常上手的。
sql数据的添加音乐和读取音乐操作基本类似:
QSqlDatabase database = QSqlDatabase::database("Music_Database");
QSqlQuery query(database);按照之前打开对应的数据库,通过query.exec()对表格进行操作
query.exec(QString("SELECT *FROM musicList WHERE musicName = '%1'").arg(info.baseName()));
首先要查找表格里是否有同名音乐,否则不在重复添加。
通过QFileInfo去路径中获得歌名和歌曲路径。
QString musicPath = info.absoluteFilePath();
QString musicName = info.baseName();
query.exec(QString( “INSERT INTO musicList WHERE musicName = '%1'").arg(info.musicName()));
query.exec(QString( “INSERT INTO musicList WHERE musicName = '%1'").arg(info.musicPath()));
这就成功在添加本地音乐的同时把音乐的路径和歌名添加到了数据库。
下一次打开音乐播放器时,自动读取数据库中歌曲路径添加到PlayList中去,就不用麻烦自己每次打开都要自己添加歌曲。
关于在线音乐播放:
打开某音乐官网,在搜索栏中输入凤凰传奇等歌曲名字(用于获取数据),并按F12进入开发者工具,并选择Network(Network会显示网页和服务器之间的数据交流)。找到对应的api接口。通过浏览器搜索该接口,返回的会是密密麻麻的json,这时就要将返回的json进行解析,从而获取歌曲信息。
该图源于网络。
在json里不难看到歌曲的各种信息,通过解析获取歌曲的id,歌手名,音乐名等。将获取的信息填入到api接口中,获取请求。
url=QString("https://music.163.com/song/media/outer/url?id=%1").arg(musicId);
PlayList->addMedia(QUrl(url));
获取的歌曲id是每首歌特有的,通过id可以精准找到需要播放的歌曲,再添加到Playlist中进行播放。
这是我的音乐播放器ui界面: