基于Qt编写的在线音乐播放器
思路: Qt中提供了音視頻播放的類,類中提供了很多播放類的接口供我們調用,基本可以實現一個完整播放器的所有功能,由于想要實現的是支持在線搜索和播放的,所以要先解決音頻的來源,再進行ui界面的設計,最后將背后的功能實現。
?一,調用網易云API
如果想自己寫服務器作為音樂播放的來源的話比較難實現,所以就調用網易云音樂的API,用特定的請求數據格式獲得數據后進行解析后就可以得到音樂的 Url? 格式,再通過Qt提供的在線播放類播放即可。?
網易云音樂提供了這樣一個 API 用于公共請求使用:? ?https://music.cyrilstudio.top
成功進入后我們點擊查看文檔?
?點擊開始使用:
?點擊使用指南可以查看該API提供了哪些基本功能,并提供了不同的功能調用的方法
?以搜索歌曲為例,請求資源的格式為 :https://music.cyrilstudio.top/search?keywords=歌曲名稱
?我們先以他提供的例子將 Url 進行驗證,如果得到如下的格式說明正確
?這是對方服務器接收你的請求后返回的 json 格式的文本,使用 http://json.cn? ?進行翻譯,查看是否包含所需要的信息,我們將 json 格式的文本全部復制到這個網頁中進行解析,得到如下信息
?id 是音樂ID ,可以唯一標識一首音樂,其他的還有歌曲名,歌手名,歌曲時長等信息都在里面,需要將其解析出來。
二,使用Qt中的 QNetworkAccessManager 類發送和接收數據
?QNetworkAccessManager 也被稱為網絡大管家類,是因為所有和網絡相關的接口都是圍繞QNetworkAccessManager創造出來的對象,并且一個應用程序只要有一個QNetworkAccessManager對象即可。該類控制著應用程序發送請求和接受回復。該類也承載著一切公共的配置以及所發請求的設置,還包含了代理配置、緩存配置、以及相對應的各種信號,reply(應答)信號可以用來監視網絡活動。所以我們可以通過這一個對象完成信息的收發。具體實現如下:
QNetworkAccessManager* http_acc = new QNetworkAccessManager; //定義并實例化一個網絡管家 QString str;str=QString("https://music.cyrilstudio.top/search?keywords=海闊天空"); //將請求格式作為字符串保存QNetworkRequest request; //定義一個請求對象request.setUrl(QString(str)); //將請求格式設置給請求對象http_acc->get(request); //請求這樣對方的服務器就會接收到正確的請求,之后便會將你所請求的內容以 json 格式發送過來,先通過接收函數接收對方發送的 json 文本后再進行解析。
當然Qt 也提供了接收信息的類? ?QNetworkReply? ,通過定義一個接收對象,將內容全部讀取出來
QNetworkReply* r; //定義一個接收信息對象 QByteArray searchInfo= r->readAll(); //全部讀取?三,解析json文本
?1,先將收到的信息提取后轉換為 json 文件對象,并檢查內容是否符合 json 語法。
searchInfo = r->readAll(); // 讀取全部信息QJsonParseError err; //錯誤信息對象QJsonDocument json_recv = QJsonDocument::fromJson(searchInfo,&err);//將json文本轉換為 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")) //如果有結果{ //在 json 文本中 {}花括號里面是QJsonObject對象, []方括號里面是QJsonArrayQJsonObject resultObject = totalObject["result"].toObject(); //就將帶 result 的內容提取后轉換為對象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 的內容提取后保存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); //發射信號number+=1; }}number = 0;}四,播放 url 歌曲?
?我們進行打印調試一下是否真正得到了想要的信息,以 《鼓樓》這首歌作為關鍵字進行搜索為例
?發現已經得到了我們想要的信息,所以接下來我們將獲取的音樂ID 以一定的Url 格式進行搜索進行驗證,?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); //將列表設置到播放器中player->play(); //播放?這樣就可以聽到自己想要聽的音樂了,這就完成了播放器的主干,其余的功能可以慢慢查看Qt中的幫助進行補充。
自己做好的簡易播放器如下,中間的空白部分功能還未完全添加
?1,搜索(在線播放)
?2,本地播放,選擇想播放的歌曲(可以選擇很多),點擊播放即可
注:源碼在我的資源中?
總結
以上是生活随笔為你收集整理的基于Qt编写的在线音乐播放器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle之高级子查询之课后练习
- 下一篇: 博客搬家攻略