Qt在线音乐播放器
效果圖片展示
1. 本地音樂(lè)播放和暫停
2. 在線音樂(lè)搜索播放
3. 通過(guò)拖動(dòng)進(jìn)度條改變播放進(jìn)度
?1.實(shí)現(xiàn)播放
private:Ui::Widget *ui;QMediaPlayer *player; //播放者QString musicpath; //本地音樂(lè)路徑bool isplay=false; //bool類型的播放判斷變量 #include <QMediaPlayer>Qt播放音樂(lè)時(shí)要添加播放者,需要添加QMediaPlayer這個(gè)頭文件,還需要在要得在項(xiàng)目文件(.pro)中加入:QT += multimedia network。QString對(duì)象用于保存需要打開的本地文件路徑。bool變量用于判斷歌曲是否正在播放,將用在播放函數(shù)中。
2.讀取本地音樂(lè)文件
通過(guò)QFileDialog 打開需要播放的歌單文件,并將其加入到·播放列表中。
void Widget::readMusicfile() {musicpath = QFileDialog::getExistingDirectory();QDir dir(musicpath);QStringList nameFileters;nameFileters<<"*.mp3";QStringList files=dir.entryList(nameFileters,QDir::Files|QDir::Readable,QDir::Name);musiclist->addItems(files);musiclist->sortItems();currentmusic->setText(musiclist->item(0)->text());player->setMedia(QUrl::fromLocalFile(musicpath+'/'+musiclist->item(0)->text()));player->setVolume(50);currentvolume->setText("50");volumeprogress->setSliderPosition(50);player->stop(); }3.音樂(lè)播放和暫停
音樂(lè)的播放和暫停通過(guò)同一個(gè)控件來(lái)控制,利用bool變量來(lái)判斷當(dāng)前音樂(lè)是否處在播放狀態(tài)。
void Widget::playpause_clicked() {if(isplay){this->player->pause();this->isplay=false;}else{this->player->play();this->isplay=true;} }4.通過(guò)滑桿來(lái)調(diào)節(jié)播放進(jìn)度
通過(guò)滑桿的位置來(lái)計(jì)算出播放的時(shí)間進(jìn)度,并顯示出來(lái)。
void Widget::player_positionChanged(qint64 position) {if(this->timeprogress->isSliderDown()){return;}timeprogress->setSliderPosition(position);int secs=position/1000;int mins=secs/60;secs=secs%60;this->currenttime->setText(QString::asprintf("%02d:%02d",mins,secs));if(player->position()==player->duration() && player->position()!=0 && player->duration()!=0){nextsong_clicked();} }?5.進(jìn)度條的總長(zhǎng)度
void Widget::player_durationChanged(qint64 duration) {timeprogress->setMaximum(duration);int secs=duration/1000;int mins=secs/60;secs=secs%60;this->durationstime->setText(QString::asprintf("%02d:%02d",mins,secs)); }6.上一首和下一首
void Widget::lastsong_clicked() {int currentrow=musiclist->currentRow();int rowcout=musiclist->count();musiclist->setCurrentRow((currentrow-1+rowcout)%rowcout); }void Widget::nextsong_clicked() {int currentrow=musiclist->currentRow();int rowcount=musiclist->count();musiclist->setCurrentRow((currentrow+1)%rowcount); }7.音量調(diào)節(jié)
void Widget::volumeprogress_valueChanged(int value) {player->setVolume(value);currentvolume->setText(QString::asprintf("%d",value)); }8.音樂(lè)播放列表
創(chuàng)建了一個(gè)QListWidget對(duì)象來(lái)展示歌單播放,可以點(diǎn)擊歌單上的歌曲進(jìn)行切換播放。
void Widget::musiclist_Changed(int currentrow) {currentmusic->setText(musiclist->item(currentrow)->text());player->setMedia(QUrl::fromLocalFile(musicpath+'/'+musiclist->item(currentrow)->text()));player->setVolume(volumeprogress->value());player->play();this->isplay=true; }9.在線歌曲搜索
這里采用通過(guò)http訪問(wèn)搜索的方式,訪問(wèn)的是網(wǎng)易云api。
void Widget::search_clicked() {QNetworkRequest request;request.setUrl(QString("http://iwxyi.com:3000/search?keywords=%0").arg(song->text()));request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded; charset=UTF-8");request.setHeader(QNetworkRequest::UserAgentHeader, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36");http_acc->get(request); }void Widget::recv_ack(QNetworkReply *r) {data=r->readAll();QJsonParseError err;QJsonDocument json=QJsonDocument::fromJson(data,&err);if(err.error!=QJsonParseError::NoError){qDebug()<<"err"<<err.errorString();return;}QJsonObject object=json.object();QStringList keys=object.keys();if(keys.contains("result")){QJsonObject result=object["result"].toObject();QStringList rkeys=result.keys();if(result.contains("songs")){QJsonArray arr=result["songs"].toArray();for(auto i:arr){QJsonObject object_1=i.toObject();musicId=object_1["id"].toInt();music_duration=object_1["duration"].toInt();musicname=object_1["name"].toString();mId=object_1["mvId"].toInt();a=mId;QStringList artistsKeys = object.keys();if(artistsKeys.contains("artists")){QJsonArray artistsArray = object["artists"].toArray();for(auto j : artistsArray){QJsonObject object_2 = j.toObject();singername = object_2["name"].toString(); // 歌手名}}if(artistsKeys.contains("album")){QJsonObject aObject = object["album"].toObject();aName = aObject["name"].toString(); // 專輯名}qDebug()<<"音樂(lè)ID:"+QString::number(musicId);qDebug()<<"音樂(lè)名:"+musicname;qDebug()<<"歌手名:"+singername;qDebug()<<"總時(shí)長(zhǎng):"+QString::number(music_duration);qDebug()<<"專輯名:"+aName;qDebug()<<"mv的id:"+QString::number(mId);}}} }10.在線音樂(lè)播放
void Widget::onlinePlay() {musiclist->hide();QString url;url=QString("https://music.163.com/song/media/outer/url?id=%0").arg(musicId);playlist->addMedia(QUrl(url));player->setPlaylist(playlist); //將playlist設(shè)置為當(dāng)前播放列表player->setMedia(playlist);player->play();player->setVolume(50);currentvolume->setText("50");volumeprogress->setSliderPosition(50);currentmusic->setText(musicname);}源碼鏈接:
(4條消息) 基于Qt實(shí)現(xiàn)的在線音樂(lè)播放器-嵌入式文檔類資源-CSDN文庫(kù)https://download.csdn.net/download/qq_45367445/86394844?spm=1001.2014.3001.5503
總結(jié)
- 上一篇: 前端学习(1676):前端系列实战课程之
- 下一篇: 泛微OA7.0下载7.1下载