2020博客之星年度总评选进行中:请为74号的狗子投上宝贵的一票!
我的投票地址:点击为我投票


文章目录

  • 1.效果图
  • 2.准备好前面获取的酷狗api接口
  • 3.网络歌曲搜索实现
  • 4.网络歌曲播放的实现
  • 5.歌曲图片显示

网络播放器系列:

  • qt 布局和样式表
  • 基于Qt的音乐播放器(一)添加音频文件,播放音乐,更新进度条
  • 基于Qt的音乐播放器(二)切换歌曲,调节音量,调节语速,暂停
  • 基于Qt的音乐播放器(三)通过酷狗音乐的api接口,返回json格式歌曲信息(播放地址,歌词,图片)
  • 项目已上传GitHub(更新中),点击获取
  • 代码中使用到了下面的头文件:
#include<QNetworkAccessManager>
#include<QVariant>
#include<QByteArray>
#include<QJsonParseError>
#include<QJsonDocument>
#include<QJsonObject>
#include<QJsonArray>
#include<QUrl>
#include<QPixmap>
#include<QSize>
  • 创作不易,你们的三连是我创作的动力!

1.效果图

老规矩,空口无凭,先上动态图,抓住你们的胃。

请忽视一些小细节,小BUG,后期会慢慢修复,嘿嘿!


2.准备好前面获取的酷狗api接口

第一个是搜索接口:
http://mobilecdn.kugou.com/api/v3/search/song?format=json&keyword=你需要填的&page=你需要填的&pagesize=你需要填的

  • keyword:搜索的内容。
  • page:搜索的页数
  • pagesize:返回的数据量,填10就是返回1首歌曲的数据。
  • 第一目标个是通过该接口,实现歌曲搜索,第二个目标是通过该接口获取特定歌曲的hash和album_id的值用于下面歌曲的播放,文字图片以及歌词(下一篇讲)的显示

第二个是歌曲详细接口:
http://www.kugou.com/yy/index.php?r=play/getdata""&hash=你需要填的&album_id=你需要填的&_=1497972864535

  • hash和album_id都是第一个接口返回json解析出来的。
  • 通过该接口,我们可以得到歌曲播放地址,图片地址,歌词等等

3.网络歌曲搜索实现

别忘了添加#include<QNetworkAccessManager> 和 #include<QNetworkReply>两个头文件

mainwindow.h

//添加类成员QNetworkAccessManager * network_manager;QNetworkRequest * network_request;

mainwindow.cpp

//构造函数中进行信号和槽的链接
//connect 有不同的写法,replyFinished也就是replyFinished()。
network_manager = new QNetworkAccessManager();
network_request = new QNetworkRequest();
connect(network_manager, &QNetworkAccessManager::finished, this, &MainWindow::replyFinished);//点击搜索按钮调用该函数,参数为搜索框内容
void MainWindow::search(QString str)
{QString KGAPISTR1 = QString("http://mobilecdn.kugou.com/api/v3/search/song?format=json""&keyword=%1&page=1&pagesize=18").arg(str);network_request->setUrl(QUrl(KGAPISTR1));network_manager->get(*network_request);
}
//为了简化代码,只使用参数keyword//槽函数
void MainWindow::replyFinished(QNetworkReply *reply)
{//获取响应的信息,状态码为200表示正常QVariant status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);//无错误返回if(reply->error() == QNetworkReply::NoError){QByteArray bytes = reply->readAll();  //获取字节QString result(bytes);  //转化为字符串qDebug()<<result;parseJson(result);//该函数用于解析api接口返回的json}else{//处理错误qDebug()<<"搜索失败";}
}void MainWindow::parseJson(QString json)
{QString songname_original; //歌曲名QString singername;        //歌手QString hashStr;           //hashQString album_name;        //专辑int duration;              //时间QByteArray byte_array;QJsonParseError json_error;QJsonDocument parse_doucment = QJsonDocument::fromJson(byte_array.append(json), &json_error);if (json_error.error == QJsonParseError::NoError){if (parse_doucment.isObject()){QJsonObject rootObj = parse_doucment.object();if (rootObj.contains("data")){QJsonValue valuedata = rootObj.value("data");if (valuedata.isObject()){QJsonObject valuedataObject = valuedata.toObject();if (valuedataObject.contains("info")){QJsonValue valueArray = valuedataObject.value("info");if (valueArray.isArray()){QJsonArray array = valueArray.toArray();int size = array.size();for (int i = 0; i < size; i++){QJsonValue value = array.at(i);if (value.isObject()){QJsonObject object = value.toObject();if (object.contains("songname_original"))//歌曲名{QJsonValue AlbumID_value = object.take("songname_original");if (AlbumID_value.isString()){songname_original = AlbumID_value.toString();}}if (object.contains("singername"))//歌手{QJsonValue AlbumID_value = object.take("singername");if (AlbumID_value.isString()){singername = AlbumID_value.toString();}}if (object.contains("album_name"))//专辑{QJsonValue AlbumID_value = object.take("album_name");if (AlbumID_value.isString()){album_name = AlbumID_value.toString();}}if (object.contains("hash")) //hash{QJsonValue FileHash_value = object.take("hash");if (FileHash_value.isString()){hashStr = FileHash_value.toString();//用Vector保存每首歌曲的hashm_Vectorlist.append(FileHash_value.toString());}}if (object.contains("album_id")){QJsonValue FileHash_value = object.take("album_id");if (FileHash_value.isString()){//用Vector保存每首歌曲的album_idm_ID.append(FileHash_value.toString());}}if (object.contains("duration"))//时长{QJsonValue AlbumID_value = object.take("duration").toInt();duration = AlbumID_value.toInt();}//将解析出的内容放到列表中ui->tableWidget->setItem(i,0,new QTableWidgetItem(songname_original));//文字居中ui->tableWidget->item(i,0)->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);ui->tableWidget->setItem(i,1,new QTableWidgetItem(singername));ui->tableWidget->item(i,1)->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);ui->tableWidget->setItem(i,2,new QTableWidgetItem(album_name));ui->tableWidget->item(i,2)->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);QString time = QString("%1:%2").arg(duration/60).arg(duration%60);ui->tableWidget->setItem(i,4,new QTableWidgetItem(time));ui->tableWidget->item(i,4)->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);}}}}}}}}else{qDebug() << json_error.errorString();}
}

如果有一天,这个代码不能用了,要注意查询的值对不对,酷狗可能是为了防止被爬,data,info,等等这些值有可能被更换成别的,要观察json。


4.网络歌曲播放的实现

当搜索列表有了内容,我们希望双击播放音乐,所以我们的第二个接口通过双击信号调用。

mainwindow.h

//类成员添加QNetworkAccessManager * network_manager2;QNetworkRequest * network_request2;

mainwindow.cpp

//构造函数中添加network_manager2 = new QNetworkAccessManager();network_request2 = new QNetworkRequest();connect(network_manager2, &QNetworkAccessManager::finished, this, &MainWindow::replyFinished2);void MainWindow::on_tableWidget_cellDoubleClicked(int row, int column)
{//歌曲请求 row 是行号QString KGAPISTR1 =QString("http://www.kugou.com/yy/index.php?r=play/getdata""&hash=%1&album_id=%2&_=1497972864535").arg(m_Vectorlist.at(row)).arg(m_ID.at(row));network_request2->setUrl(QUrl(KGAPISTR1));//这句话很重要,我们手动复制url放到浏览器可以获取json,但是通过代码不行,必须加上下面这句才可以network_request2->setRawHeader("Cookie","kg_mid=2333");network_request2->setHeader(QNetworkRequest::CookieHeader, 2333);network_manager2->get(*network_request2);
}void MainWindow::replyFinished2(QNetworkReply *reply)
{//获取响应的信息,状态码为200表示正常QVariant status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);//无错误返回if(reply->error() == QNetworkReply::NoError){QByteArray bytes = reply->readAll();  //获取字节QString result(bytes);  //转化为字符串parseJsonSongInfo(result);//解析json}else{//处理错误qDebug()<<"歌曲播放失败";}
}void MainWindow::parseJsonSongInfo(QString json)
{QString audio_name;//歌手-歌名QString play_url;//播放地址QString img;QByteArray byte_array;QJsonParseError json_error;QJsonDocument parse_doucment = QJsonDocument::fromJson(byte_array.append(json), &json_error);if(json_error.error == QJsonParseError::NoError){if(parse_doucment.isObject()){QJsonObject rootObj = parse_doucment.object();if(rootObj.contains("data")){QJsonValue valuedata = rootObj.value("data");if(valuedata.isObject()){QJsonObject valuedataObject = valuedata.toObject();QString play_urlStr("");if(valuedataObject.contains("play_url")){QJsonValue play_url_value = valuedataObject.take("play_url");if(play_url_value.isString()){play_urlStr = play_url_value.toString();      //歌曲的urlif(play_urlStr!=""){qDebug()<<play_urlStr;player->setMedia(QUrl(play_urlStr));player->setVolume(50);player->play();}}}if(valuedataObject.contains("audio_name")){QJsonValue play_name_value = valuedataObject.take("audio_name");if(play_name_value.isString()){QString audio_name = play_name_value.toString();    //歌曲名字if(audio_name!=""){//显示qDebug()<<audio_name;ui->label_2->setText(audio_name);}}}//下一篇的歌词获取也是在这里添加代码//图片显示代码在这里添加}else{qDebug()<<"出错";}}}}
}

5.歌曲图片显示

mainwindow.h

//类成员添加QNetworkAccessManager * network_manager3;QNetworkRequest * network_request3;

mainwindow.cpp

    network_manager3 = new QNetworkAccessManager();network_request3 = new QNetworkRequest();connect(network_manager3, &QNetworkAccessManager::finished,this, &MainWindow::replyFinished3);//这段代码添加到上面的图片显示位置即可
if (valuedataObject.contains("img"))
{QJsonValue play_name_value = valuedataObject.take("img");if (play_name_value.isString()){QString audio_name = play_name_value.toString();        if (audio_name != ""){m_Jpg.append(audio_name);network_request3->setUrl(QUrl(audio_name));network_manager3->get(*network_request3);}}
}void MainWindow::replyFinished3(QNetworkReply *reply)
{//获取响应的信息,状态码为200表示正常QVariant status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);//无错误返回if(reply->error() == QNetworkReply::NoError){QByteArray bytes = reply->readAll();  //获取字节//由于获取的图片像素过大,而我们显示的图片很小,所以我们需要压缩图片的像素,我们label的大小为45*45,所以我们把图片压缩为45*45QPixmap pixmap;QSize picSize(45,45);pixmap.loadFromData(bytes);//pixmap.save("url"); 也可以现在图片ui->label_10->setPixmap(pixmap.scaled(picSize));}else{//处理错误qDebug()<<"处理错误3";}
}

上述代码还有很大的优化空间,代码重复性过大,有时间的话进行优化一波,这篇就到这里,下篇歌词的显示,不见不散。

基于Qt的网络音乐播放器(四)酷狗API接口获取歌曲的搜索列表和歌曲的播放相关推荐

  1. 基于QT的网络音乐播放器(一)

    自学Qt已经有一段时间了,但是始终感觉自己还是很弱(其实并不是感觉自己很弱,是自己本来就很弱,哈哈).自己也照着书上敲了几个例子,但觉得还是要写点东西才能真正运用起来.所以,前段时间就写了个很简单的音 ...

  2. android7.1.1开发过程中出现部分音乐播放器(酷狗,QQ音乐,酷我音乐)歌词不能长久显示在桌面

    android7.1.1开发过程中出现部分音乐播放器(酷狗,QQ音乐,酷我音乐)歌词不能长久显示在桌面 处理:二号三方apk沟通,三方apk在7.1.1上做相应的适配, 这个和android7.1.1 ...

  3. 基于QT的网络音乐播放器(四)

    关于歌词的显示,其实我的主要思想就是解析歌词部分的字符串.歌词显示分为两部分,一部分是播放器右侧的歌词显示以及下面的桌面歌词的显示.其中桌面歌词让我很难受,想了很久,后面看到一个大佬的一篇文章后才有了 ...

  4. html5模仿手机音乐播放器,仿酷狗html5手机音乐播放器主要部分代码_html5教程技巧...

    HTML5作品,经测试,效果确定不错,遗憾的是只支持谷歌和苹果等以webkit核心的浏览器,网友体验的时候请使用谷歌等浏览器来运行,不然的话无法看到效果,不说了,看效果吧 代码如下: 主要部分代码如下 ...

  5. 【基于Qt的在线音乐播放器】

    基于Qt的在线音乐播放器 项目功能: 本在线音乐播放器的功能在于创建一个音乐播放器页面,可以实现搜索功能通过HTTP协议获取网络中数据并解析出来,播放搜索到的歌曲并展示相关信息.效果如图: 相关类及功 ...

  6. 基于Qt的在线音乐播放器

    1.了解音乐播放器应该有哪些功能: 音乐播放器的各种控制(上下曲,单曲循环,随机播放,顺序播放),歌曲列表,歌词显示,本地音乐保存,在线音乐搜索,在线音乐播放. 2.制作Qt音乐播放器一定要了解Qme ...

  7. 基于QT开发的音乐播放器(附源码)

    基于QT开发的音乐播放器(附源码) 一.简介 1.介绍 2.功能描述 3.系统功能层次模块图 4.各模块功能描述 (1)播放界面 (2)歌词 (3)歌曲信息 (4)歌曲列表 5.文件格式 6.运行环境 ...

  8. 项目记录:基于QT的简易音乐播放器

    一.功能介绍 1.能够自定义背景图片 2.实现了音乐播放器的最基本功能,即播放与否.切换歌曲及歌单.显示歌曲信息.调节音量.播     放模式等 3.根据所选中的框体,更新播放列表及播放顺序 4.从播 ...

  9. 基于QT的网络视频会议系统---KNVM

    本文来自http://blog.csdn.net/slientman原创,引用必须注明出处! KNVM网络视频会议系统V1.0 经过2年艰苦细致的开发,终于完成了基于QT的网络视频会议系统,特此记录, ...

最新文章

  1. 机器学习也能套模版:在线选择模型和参数,一键生成demo
  2. 查看springboot中tomcat版本
  3. 近世代数--群--怎么判断是不是群?
  4. 微软CEO纳德拉恢弘计划:让开发者始终忘不了微软
  5. 组件库实战 | 用vue3+ts实现全局Header和列表数据渲染ColumnList
  6. 你真的理解事件绑定、事件冒泡和事件委托吗?
  7. 自定义控件_VIewPager显示多个Item
  8. 使用sql语句创建和删除约束示例代码
  9. 学习生物信息的系列书籍
  10. 信息学奥赛C++语言: 奶牛乘法
  11. 手机安装linux发行版,最近发布新版本的Linux发行版汇总 - 2020-02-14
  12. MySQL数据库基础(简介、操作规范、基本指令)
  13. 系统性风险与个体性风险
  14. 利用 nodejs 解析 m3u8 格式文件,并下 ts 合并为 mp4
  15. base64和jpg/png互转
  16. 一年级abb式词语并造句_abb词语造句,用ABB词语造句
  17. 微分是线性主部定义应该怎么说?
  18. python爬虫库scrapy_使用Python爬虫Scrapy框架爬取数据
  19. git branch -a查看不了所有远程分支
  20. 计算机组成原理简介-(一)概论

热门文章

  1. 【详解】分页方式:Page Helper的使用
  2. 小曹谈技术之中文拼音输入法
  3. htb_Soccer
  4. MBR分区的恢复 - 数据恢复
  5. 修改图片颜色 色相 饱和度 亮度 ColorMatrix
  6. 【原创】VMware安装没有引导的Ghost镜像,超级详细,步步讲解
  7. C语言 06.函数和多文件编程
  8. 想了解Vuex?一定先把这篇笔记码住!
  9. 北京站议题解析,还有你们最期待的送礼环节来啦!
  10. php是什么电荷,分子中电荷变化种种 - 量子化学 - 小木虫 - 学术 科研 互动社区...