admin管理员组文章数量:1568433
效果图片展示
1. 本地音乐播放和暂停
2. 在线音乐搜索播放
3. 通过拖动进度条改变播放进度
1.实现播放
private:
Ui::Widget *ui;
QMediaPlayer *player; //播放者
QString musicpath; //本地音乐路径
bool isplay=false; //bool类型的播放判断变量
#include <QMediaPlayer>
Qt播放音乐时要添加播放者,需要添加QMediaPlayer这个头文件,还需要在要得在项目文件(.pro)中加入:QT += multimedia network。QString对象用于保存需要打开的本地文件路径。bool变量用于判断歌曲是否正在播放,将用在播放函数中。
2.读取本地音乐文件
通过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.音乐播放和暂停
音乐的播放和暂停通过同一个控件来控制,利用bool变量来判断当前音乐是否处在播放状态。
void Widget::playpause_clicked()
{
if(isplay)
{
this->player->pause();
this->isplay=false;
}
else
{
this->player->play();
this->isplay=true;
}
}
4.通过滑杆来调节播放进度
通过滑杆的位置来计算出播放的时间进度,并显示出来。
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.进度条的总长度
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.音量调节
void Widget::volumeprogress_valueChanged(int value)
{
player->setVolume(value);
currentvolume->setText(QString::asprintf("%d",value));
}
8.音乐播放列表
创建了一个QListWidget对象来展示歌单播放,可以点击歌单上的歌曲进行切换播放。
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.在线歌曲搜索
这里采用通过http访问搜索的方式,访问的是网易云api。
void Widget::search_clicked()
{
QNetworkRequest request;
request.setUrl(QString("http://iwxyi: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()<<"音乐ID:"+QString::number(musicId);
qDebug()<<"音乐名:"+musicname;
qDebug()<<"歌手名:"+singername;
qDebug()<<"总时长:"+QString::number(music_duration);
qDebug()<<"专辑名:"+aName;
qDebug()<<"mv的id:"+QString::number(mId);
}
}
}
}
10.在线音乐播放
void Widget::onlinePlay()
{
musiclist->hide();
QString url;
url=QString("https://music.163/song/media/outer/url?id=%0").arg(musicId);
playlist->addMedia(QUrl(url));
player->setPlaylist(playlist); //将playlist设置为当前播放列表
player->setMedia(playlist);
player->play();
player->setVolume(50);
currentvolume->setText("50");
volumeprogress->setSliderPosition(50);
currentmusic->setText(musicname);
}
源码链接:
(4条消息) 基于Qt实现的在线音乐播放器-嵌入式文档类资源-CSDN文库https://download.csdn/download/qq_45367445/86394844?spm=1001.2014.3001.5503
版权声明:本文标题:Qt在线音乐播放器 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1725773805a1041696.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论