Qt在线音乐播放器

效果图片展示

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.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()<<"音乐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.com/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.net/download/qq_45367445/86394844?spm=1001.2014.3001.5503

  • 7
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值