国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

Qt之音樂(lè)播放器一

2019-11-10 21:34:16
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

1、實(shí)現(xiàn)播放歌曲

void Widget::on_playMusicButton_clicked()//點(diǎn)擊播放歌曲按鈕{    if(currentSongIndex > songIdList.size())        return;    currentSongInfo = this->getSongRealLinkById(songIdList.at(currentSongIndex));    mediaPlayer->setMedia(QUrl(currentSongInfo.songRealLink));    mediaPlayer->play();    QString lyric = this->getLyric(currentSongInfo.lyricLink);//從網(wǎng)上獲取歌詞    lyricList = this->parse(lyric);//將lyric一行行地解析到lyricList}//1、獲取頻道列表QList<CHANNEL_INFO> Widget::getChannelList(){    const QString channelUrl = "http://fm.baidu.com/dev/api/?tn=channellist";    QList<CHANNEL_INFO> channelInfoList;    QNetworkRequest networkRequest;    QNetworkaccessManager *networkManager = new QNetworkAccessManager;    networkRequest.setUrl(QUrl(channelUrl));    networkManager->setCookieJar(0);    QNetworkReply *reply = networkManager->get(networkRequest);    QEventLoop loop;    connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));    loop.exec();    reply->deleteLater();    QByteArray buf = reply->readAll();    QJsonParseError jsonError;    QJsonDocument jsonRes = QJsonDocument::fromJson(buf, &jsonError);;    if(jsonError.error == QJsonParseError::NoError)    {        if(jsonRes.isObject())        {            QVariantMap result = jsonRes.toVariant().toMap();//提取花括號(hào)里的鍵值對(duì)            foreach(QVariant channel, result["channel_list"].toList())//提取[]里的頻道            {   //由于每個(gè)頻道也是一個(gè){}                QVariantMap channelMap = channel.toMap();//提取花括號(hào)的鍵值對(duì)                CHANNEL_INFO channelInfo;                channelInfo.channelId = channelMap["channel_id"].toString();                channelInfo.channelName = channelMap["channel_name"].toString();                channelInfoList.append(channelInfo);            }        }    }    return channelInfoList;}//2、根據(jù)頻道id,獲取某個(gè)頻道下的歌曲列表(比如推薦頻道public_tuijian_sPRing)QList<QString> Widget::getSongIdList(QString channelId){    const QString playListUrl = "http://fm.baidu.com/dev/api/?tn=playlist&format=json&id=";    QNetworkRequest networkRequest;    QNetworkAccessManager *networkManager = new QNetworkAccessManager;    networkRequest.setUrl(QUrl(playListUrl + channelId));    networkManager->setCookieJar(0);    QNetworkReply *reply = networkManager->get(networkRequest);    QEventLoop loop;    connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));    loop.exec();    reply->deleteLater();    QList<QString> songId;    QByteArray buf = reply->readAll();    QJsonParseError jsonError;    QJsonDocument jsonRes = QJsonDocument::fromJson(buf, &jsonError);;    if(jsonError.error == QJsonParseError::NoError)    {        if(jsonRes.isObject())        {            QVariantMap result = jsonRes.toVariant().toMap();            foreach(QVariant song, result["list"].toList())            {                QVariantMap songMap = song.toMap();                QString id = songMap["id"].toString();//獲取歌曲id                //如果歌曲ID有效                if(!id.isEmpty())                {                    songId.append(id);                }            }        }    }    return songId;}//3、根據(jù)songID(比如1615837),獲取一首歌的歌曲名稱和下載鏈接SONG_INFO Widget::getSongRealLinkById(QString songId){    const QString downLoadLinkUrl = "http://music.baidu.com/data/music/fmlink?type=mp3&rate=320&songIds=";    QNetworkRequest networkRequest;    QNetworkAccessManager networkManager;    networkRequest.setUrl(QUrl(downLoadLinkUrl + songId));    networkManager.setCookieJar(0);    QNetworkReply *reply = networkManager.get(networkRequest);    QEventLoop loop;    connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));    loop.exec();    reply->deleteLater();    //歌曲信息    SONG_INFO songInfo;    QByteArray buf = reply->readAll();    QJsonParseError jsonError;    QJsonDocument jsonRes = QJsonDocument::fromJson(buf, &jsonError);;    if(jsonError.error == QJsonParseError::NoError)    {        if(jsonRes.isObject())        {            QVariantMap result = jsonRes.toVariant().toMap();            QVariantMap dataList = result["data"].toMap();            foreach(QVariant data, dataList["songList"].toList())            {                QVariantMap linkMap = data.toMap();                songInfo.songRealLink = linkMap["songLink"].toString();                songInfo.songName = linkMap["songName"].toString();                songInfo.artistName = linkMap["artistName"].toString();                songInfo.songPicSmall = linkMap["songPicSmall"].toString();                songInfo.songPicRadio = linkMap["songPicRadio"].toString();                songInfo.albumName = linkMap["albumName"].toString();                songInfo.lyricLink = linkMap["lrcLink"].toString();            }        }    }    return songInfo;}

2、實(shí)現(xiàn)歌詞顯示

//根據(jù)lrcLink獲取歌詞QString Widget::getLyric(QString lyricLink)//lyricLink是歌詞下載地址{    QNetworkRequest networkRequest;    QNetworkAccessManager networkManager;    networkRequest.setUrl(QUrl(lyricLink));    QNetworkReply *reply = networkManager.get(networkRequest);    QEventLoop loop;    connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));    loop.exec();    reply->deleteLater();    QString lyrc;    lyrc = reply->readAll();    return lyrc;}//解析從網(wǎng)上獲取的歌詞QList<QLyric> Widget::parse(QString lyric){    QTextStream stream(&lyric);    QTextCodec *codec = QTextCodec::codecForName("utf-8");    stream.setCodec(codec);    currentLyricIndex = 0;    lyricList.clear();    //QRegExp解析歌詞    QRegExp timeExp;    timeExp.setPatternSyntax(QRegExp::RegExp);    timeExp.setCaseSensitivity(Qt::CaseSensitive);    timeExp.setPattern("//[([0-9]{2}):([0-9]{2})//.([0-9]{2})//]");    //匹配[00:02.42]    QList<QLyric> result;    while (!stream.atEnd())    {        QString line = stream.readLine();        int ret = timeExp.indexIn(line);        QList<QTime> ticks;        int lastindex = 0;        while (ret >= 0)        {            QStringList tstr = timeExp.capturedTexts();            QTime time(0, tstr[1].toInt(), tstr[2].toInt(), tstr[3].toInt());            ticks.append(time);            lastindex = ret + timeExp.matchedLength();            ret = timeExp.indexIn(line, lastindex);        }//經(jīng)過(guò)測(cè)試,ticks只會(huì)含有一個(gè)項(xiàng)        QString lyricstr = line.right(line.size() - lastindex);//提取歌詞        for (const QTime& t : ticks)//c++11        {            QLyric lyric;            lyric.time = t.minute() * 60 * 1000 + t.second() * 1000 + t.msec();//單位ms            lyric.lyric = lyricstr;            result.append(lyric);        }    }    std::sort(result.begin(), result.end(), [] (const QLyric& a, const QLyric& b) -> bool {        return a.time < b.time;    });    return result;//保存了一行行的歌詞}//顯示歌詞的槽函數(shù)void Widget::slotShowLyric(qint64 position){    if(lyricList.size() <= 0 || currentLyricIndex >= lyricList.size())        return;    for(int i = 0; i < lyricList.size(); i++)    {        if(position > lyricList.at(i).time)        {            currentLyricIndex = i;        }    }    //顯示position之后的歌詞,position之前的已經(jīng)播放過(guò)了    if(position > lyricList.at(currentLyricIndex).time)    {        //始終顯示作者名和歌曲名        QString lrc;        lrc.clear();        lrc += QString("<p align='center'><span style=' font-style:italic;'>");        lrc += currentSongInfo.artistName + " - " + currentSongInfo.songName;        lrc += QString("</span></p>");        //j從m_iCurrentIndex - 1開(kāi)始,是為了顯示出正在唱的前一句        for(int j = currentLyricIndex - 1; j < lyricList.size(); j++)        {            if(j < 0)                continue;            if(currentLyricIndex == j)//正在唱的歌詞,顏色加粗            {                lrc += QString("<p align='center'><span style=' font-weight:600;'>");                lrc += lyricList.at(currentLyricIndex).lyric;                lrc += QString("</span></p>");            }            else            {                lrc += "<p align='center'>";                lrc += lyricList.at(j).lyric;                lrc += "</p>";            }        }        ui->lyricLabel->setText(lrc);        currentLyricIndex++;    }}

3、實(shí)現(xiàn)歌曲下載

void Widget::on_downLoadButton_clicked()//點(diǎn)擊下載歌曲按鈕{    QString fileName;    QDir dir;    if(!dir.exists("./download"))    {        dir.mkdir("./download");    }    fileName = "./download/" + currentSongInfo.songName + ".mp3";    this->downLoadMusic(fileName, currentSongInfo.songRealLink);}//從網(wǎng)上下載歌曲,fileName是下載之后文件名(含路徑),url是歌曲下載鏈接void Widget::downLoadMusic(QString fileName, QString songLink){    QNetworkRequest networkRequest;    QNetworkAccessManager networkManager;    networkRequest.setUrl(QUrl(songLink));    QNetworkReply *reply = networkManager.get(networkRequest);    QEventLoop loop;    connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));    loop.exec();    reply->deleteLater();    QFile file;    file.setFileName(fileName);    bool ok = file.open(QIODevice::WriteOnly);    if(ok)    {        file.write(reply->readAll());    }}完整代碼下載:http://download.csdn.net/detail/bladeandmaster88/9749987
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宜黄县| 贞丰县| 白河县| 陕西省| 平乐县| 西宁市| 灵石县| 沭阳县| 大埔区| 藁城市| 西安市| 平凉市| 怀宁县| 溧阳市| 荔波县| 和顺县| 双江| 堆龙德庆县| 铜山县| 建水县| 西贡区| 横峰县| 洞头县| 固原市| 留坝县| 个旧市| 灵璧县| 抚松县| 施甸县| 外汇| 额尔古纳市| 尤溪县| 湛江市| 黔南| 应城市| 开化县| 上虞市| 镇远县| 上饶市| 北安市| 赤峰市|