基于Qt编写的在线音乐播放器
思路: Qt中提供了音視頻播放的類,類中提供了很多播放類的接口供我們調(diào)用,基本可以實現(xiàn)一個完整播放器的所有功能,由于想要實現(xiàn)的是支持在線搜索和播放的,所以要先解決音頻的來源,再進(jìn)行ui界面的設(shè)計,最后將背后的功能實現(xiàn)。
?一,調(diào)用網(wǎng)易云API
如果想自己寫服務(wù)器作為音樂播放的來源的話比較難實現(xiàn),所以就調(diào)用網(wǎng)易云音樂的API,用特定的請求數(shù)據(jù)格式獲得數(shù)據(jù)后進(jìn)行解析后就可以得到音樂的 Url? 格式,再通過Qt提供的在線播放類播放即可。?
網(wǎng)易云音樂提供了這樣一個 API 用于公共請求使用:? ?https://music.cyrilstudio.top
成功進(jìn)入后我們點擊查看文檔?
?點擊開始使用:
?點擊使用指南可以查看該API提供了哪些基本功能,并提供了不同的功能調(diào)用的方法
?以搜索歌曲為例,請求資源的格式為 :https://music.cyrilstudio.top/search?keywords=歌曲名稱
?我們先以他提供的例子將 Url 進(jìn)行驗證,如果得到如下的格式說明正確
?這是對方服務(wù)器接收你的請求后返回的 json 格式的文本,使用 http://json.cn? ?進(jìn)行翻譯,查看是否包含所需要的信息,我們將 json 格式的文本全部復(fù)制到這個網(wǎng)頁中進(jìn)行解析,得到如下信息
?id 是音樂ID ,可以唯一標(biāo)識一首音樂,其他的還有歌曲名,歌手名,歌曲時長等信息都在里面,需要將其解析出來。
二,使用Qt中的 QNetworkAccessManager 類發(fā)送和接收數(shù)據(jù)
?QNetworkAccessManager 也被稱為網(wǎng)絡(luò)大管家類,是因為所有和網(wǎng)絡(luò)相關(guān)的接口都是圍繞QNetworkAccessManager創(chuàng)造出來的對象,并且一個應(yīng)用程序只要有一個QNetworkAccessManager對象即可。該類控制著應(yīng)用程序發(fā)送請求和接受回復(fù)。該類也承載著一切公共的配置以及所發(fā)請求的設(shè)置,還包含了代理配置、緩存配置、以及相對應(yīng)的各種信號,reply(應(yīng)答)信號可以用來監(jiān)視網(wǎng)絡(luò)活動。所以我們可以通過這一個對象完成信息的收發(fā)。具體實現(xiàn)如下:
QNetworkAccessManager* http_acc = new QNetworkAccessManager; //定義并實例化一個網(wǎng)絡(luò)管家 QString str;str=QString("https://music.cyrilstudio.top/search?keywords=海闊天空"); //將請求格式作為字符串保存QNetworkRequest request; //定義一個請求對象request.setUrl(QString(str)); //將請求格式設(shè)置給請求對象http_acc->get(request); //請求這樣對方的服務(wù)器就會接收到正確的請求,之后便會將你所請求的內(nèi)容以 json 格式發(fā)送過來,先通過接收函數(shù)接收對方發(fā)送的 json 文本后再進(jìn)行解析。
當(dāng)然Qt 也提供了接收信息的類? ?QNetworkReply? ,通過定義一個接收對象,將內(nèi)容全部讀取出來
QNetworkReply* r; //定義一個接收信息對象 QByteArray searchInfo= r->readAll(); //全部讀取?三,解析json文本
?1,先將收到的信息提取后轉(zhuǎn)換為 json 文件對象,并檢查內(nèi)容是否符合 json 語法。
searchInfo = r->readAll(); // 讀取全部信息QJsonParseError err; //錯誤信息對象QJsonDocument json_recv = QJsonDocument::fromJson(searchInfo,&err);//將json文本轉(zhuǎn)換為 json 文件對象if(err.error != QJsonParseError::NoError) //判斷是否符合語法{qDebug() <<"搜索歌曲Json獲取格式錯誤"<< err.errorString();return;}2,如果語法合法后,我們就要檢查是否有我們想要的信息,并對各個信息的 key 值作為解析條件提取出來。?
QJsonObject totalObject = json_recv.object(); QStringList keys = totalObject.keys(); // 列出json里所有的keyif(keys.contains("result")) //如果有結(jié)果{ //在 json 文本中 {}花括號里面是QJsonObject對象, []方括號里面是QJsonArrayQJsonObject resultObject = totalObject["result"].toObject(); //就將帶 result 的內(nèi)容提取后轉(zhuǎn)換為對象QStringList resultKeys = resultObject.keys(); //保存所有keyif(resultKeys.contains("songs")) //如果 key 為songs ,代表找到了歌曲{QJsonArray array = resultObject["songs"].toArray();for(auto i : array) //開始獲取歌曲中的信息{QJsonObject object = i.toObject();musicId = object["id"].toInt(); // 音樂idmusicDuration = object["duration"].toInt(); // 音樂長度musicName = object["name"].toString(); // 音樂名mvId = object["mvid"].toInt(); // mvidQStringList artistsKeys = object.keys();if(artistsKeys.contains("artists")) //如果result中包含了 artists{QJsonArray artistsArray = object["artists"].toArray(); //將 artist 的內(nèi)容提取后保存for(auto j : artistsArray) {QJsonObject object2 = j.toObject();singerName = object2["name"].toString(); // 歌手名}}if(artistsKeys.contains("album")) //包含了專輯{QJsonObject albumObjct = object["album"].toObject();albumName = albumObjct["name"].toString(); // 專輯名} // qDebug()<<"音樂ID:"+QString::number(musicId); // qDebug()<<"音樂名:"+musicName; // qDebug()<<"歌手名:"+singerName; // qDebug()<<"總時長:"+QString::number(musicDuration); // qDebug()<<"專輯名:"+albumName; // qDebug()<<"mv的id:"+QString::number(mvId);emit searchFinal(number,musicId,mvId,musicName,singerName,albumName,musicDuration); //發(fā)射信號number+=1; }}number = 0;}四,播放 url 歌曲?
?我們進(jìn)行打印調(diào)試一下是否真正得到了想要的信息,以 《鼓樓》這首歌作為關(guān)鍵字進(jìn)行搜索為例
?發(fā)現(xiàn)已經(jīng)得到了我們想要的信息,所以接下來我們將獲取的音樂ID 以一定的Url 格式進(jìn)行搜索進(jìn)行驗證,?http:// https://music.163.com/song/media/outer/url?id=音樂ID
有了這個Url 之后我們就可以播放音樂了,如下:
QMediaPlayer *player=new QMediaPlayer; //播放對象QMediaPlayerlist playerlist=new QMediaPlayerlist; //播放列表對象QString url; //保存urlurl=QString("https://music.163.com/song/media/outer/url?id=%0").arg(musicId); //將音樂ID作為格式輸入到url中playlist->addMedia(QUrl(url)); //添加一音樂到播放列表中player->setMedia(playlist); //將列表設(shè)置到播放器中player->play(); //播放?這樣就可以聽到自己想要聽的音樂了,這就完成了播放器的主干,其余的功能可以慢慢查看Qt中的幫助進(jìn)行補(bǔ)充。
自己做好的簡易播放器如下,中間的空白部分功能還未完全添加
?1,搜索(在線播放)
?2,本地播放,選擇想播放的歌曲(可以選擇很多),點擊播放即可
注:源碼在我的資源中?
總結(jié)
以上是生活随笔為你收集整理的基于Qt编写的在线音乐播放器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle之高级子查询之课后练习
- 下一篇: 前端学习(1999)vue之电商管理系统