写了这么多的博客,关于网络的还不算多,经常有人询问一些关于网络传输、制作在线试听及下载音乐、构造及解析数据等的一些问题,今天就在这里一并讲解。
 
网络操作:
    主要涉及:QNetworkAccessManager、QNetworkRequest、QNetworkReply这三个类。
参考:
 
数据操作:
    主要涉及:Json、XML(因为数据传输都是有固定格式的,大多数使用Json)。操作Json使用QJsonDocument、QJsonObject、QJsonArray。操作XML使用(QDomDocument或者QXmlStreamReader)。
参考: 
 
    网络操作与数据操作参考如上资料即可,下来讲解如何利用Qt进行网络传输并交互数据。
 
需求:获取歌曲信息,可在线试听并进行歌曲、歌词下载等操作
步骤:
(1)获取公开的API,比如:百度mp3接口(baidu mp3 api)
(2)使用QNetworkAccessManager、QNetworkRequest、QNetworkReply调用接口获取歌曲信息—-般为Json或者XML格式。
(3)解析JSON使用QJsonDocument、QJsonObject、QJsonArray,解析XML使用QDomDocument或QXmlStreamReader,即可获取歌曲信息。 
(4)解析之后一般可以得到歌曲id、歌曲名称、歌曲链接、艺术家、专辑名称、歌词等信息,根据歌曲id或者歌曲链接下载或在线试听。
 
很多人也许会有以下疑问:
(1)API怎么获取?
    这应该不算是问题吧,没有内部提供的API,那么只能找一些公开的。比如:想实现关于QQ相关的功能,即可参考:API列表- 腾讯开放平台
(2)API如何使用?
    可参考API文档,接口要么是内部提供,要么是第三方提供,如果没有详细的API文档,那么谁知道怎么用?需求变更怎么办?后期项目又如何去跟踪?
 
 
    看到这里,对API的使用应该没有什么问题了。下面,我们就利用百度mp3接口来获取在线音乐。
 
一、调用接口获取详细数据
接口:http://mp3.baidu.com/dev/api/?tn=getinfo&ct=0&ie=utf-8&word=&format=
参数:
    word: "歌曲名" 或 "歌手名", //歌曲名
    format: "json" 或 "xml", //返回数据格式,Json 或 XML,默认XML
请求方式:GET
 
可以通过浏览器进行测试:
Json格式:
 
 
XML格式:

 
二、通过歌曲id(song_id)获取歌曲下载地址
接口:http://ting.baidu.com/data/music/links?songIds=
参数:
    songIds: "31496563"   //歌曲id,从第1个列表中得到的歌曲id 
    callback: "callback"  //不为空时,返回jsonp格式数据
请求方式:GET
 
可以通过浏览器进行测试:
 

 
三、下载、试听歌曲,下载歌词
mp3下载地址为songLink,后面加xcode参数,xcode每秒自动更新一次(可以不断刷新尝试)。 
歌词lrc地址为http://ting.baidu.com加lrcLink
如:http://ting.baidu.com/data2/lrc/31626524/31626524.lrc
 
代码如下:
#define  MP3_URL                 "http://mp3.baidu.com/dev/api/?"

//设置发送的数据
QByteArray byte_array;
byte_array.append("tn=getinfo");
byte_array.append("&ct=0");
byte_array.append("&ie=utf-8");
byte_array.append("&word=" + text); //text指歌曲名称、歌手名称
byte_array.append("&format=json"); QString url = MP3_URL + QString(byte_array); network_manager = new QNetworkAccessManager();
network_request = new QNetworkRequest();
connect(network_manager, &QNetworkAccessManager::finished, this, &HttpManager::replyFinished);
network_request->setUrl(QUrl(url));
network_manager->get(*network_request); void HttpManager::replyFinished(QNetworkReply *reply)
{
//获取响应的信息,状态码为200表示正常
QVariant status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); //无错误返回
if(reply->error() == QNetworkReply::NoError)
{
QByteArray bytes = reply->readAll(); //获取字节
QString result(bytes); //转化为字符串 parseJson(result); //自定义方法,解析歌曲数据
}
else
{
//处理错误
}
} void HttpManager::parseJson(QString json)
{
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.isArray())
{
QJsonArray array = parse_doucment.array();
int size = array.size();
for(int i=0; i
{
QJsonValue value = array.at(i);
if(value.isObject())
{
QJsonObject object = value.toObject();
if(object.contains("song"))
{
QJsonValue name_value = object.take("song");
if(name_value.isString())
{
QString name = name_value.toString();
QString name2 = name;
QListWidgetItem *list_item = new QListWidgetItem();
list_item->setText(name);
this->addItem(name);
} if(song_id.isEmpty())
{
if(object.contains("song_id"))
{
QJsonValue song_value = object.take("song_id");
if(song_value.isString())
{
QString song_id = song_value.toString();
}
}
}
}
}
}
}
}
}
    这样就可以获取,音乐文件的所有信息了,然后再次请求,获取歌曲的下载链接、歌词等信息,即可实现下载及在线试听功能。
 
在线试听:
QMediaPlayer *player = new QMediaPlayer(this);
player->setMedia(QUrl(song_link)); //song_link为根据步骤二获取的歌曲链接
player->setVolume(50);
player->play();
 
效果如下:
 
 
注:
    技术在于交流、沟通,转载请注明出处并保持作品的完整性。
 

Qt实现网络播放器的更多相关文章

  1. 基于ffmpeg网络播放器的教程与总结

    基于ffmpeg网络播放器的教程与总结   一.         概述 为了解决在线无广告播放youku网上的视频.(youku把每个视频切换成若干个小视频). 视频资源解析可以从www.flvcd. ...

  2. dzz使用总结(添加云盘,好用的Web文件管理器,网络播放器)

    dzz添加云盘: http://www.lebook.me/book/22822#fid_3990471 呆萌http://pan.diemoe.net/s/GcdFI4 网络播放器 mediaele ...

  3. Qt 简易图片播放器

    一.前言 使用 Qt 制作了一个简单的图片播放器,点击 "浏览按钮" 浏览图片所在目录,目录中的所有图片缩小图标和名称会显示在左侧的图片列表中,点击列表中的图片项,可以在右侧区域的 ...

  4. Qt+MPlayer音乐播放器开发笔记(一):ubuntu上编译MPlayer以及Demo演示

    前言   在ubuntu上实现MPlayer播放器播放音乐.   Demo                Mplayer   MPlayer是一款开源多媒体播放器,以GNU通用公共许可证发布.此款软件 ...

  5. Qt开发Gif播放器

    一.资源下载地址 https://www.aliyundrive.com/s/jBU2wBS8poH 本项目路径:项目->免费->Gif播放器(包含整个工程源码,vs2019打开即可编译运 ...

  6. 在线音乐播放器-----酷狗音乐api接口抓取

    首先身为一个在线音乐播放器,需要前端和数据库的搭配使用. 在数据库方面,我们没有办法制作,首先是版权问题,再加上数据量.所以我们需要借用其他网络播放器的数据库. 但是这些在线播放器,如百度,酷狗,酷我 ...

  7. ubuntu下好用的音乐播放器audacious

    audacious是ubuntu下一款非常好用的音乐播放器,万能的音乐播放器而且简洁美观,可以播放ape各种无损发烧音乐格式. 如果想听音乐的话,现在百度音乐,酷我音乐,酷狗音乐等都是有网络播放器的, ...

  8. 【U3D】播放器设置(PlayerSettings)

    播放器设置 (Player Settings) 播放器设置 (Player Settings) 用于为您要在 Unity 中编译的最终游戏定义各项(特定于平台的)参数.例如,参数中的一些值用于您打开单 ...

  9. 播放器设置 Player Settings

    原地址:http://game.ceeger.com/Manual/class-PlayerSettings.html#Android Player Settings is where you def ...

随机推荐

  1. WPF 文字换行TextWrapping 显示不全用省略号TextTrimming 显示不全弹提示内容ToolTip

    原文:WPF 文字换行TextWrapping 显示不全用省略号TextTrimming 显示不全弹提示内容ToolTip [TextBlock] 换行    TextWrapping="W ...

  2. SCM文章9类:外部中断示例程序

    JP3遇见P0口,JP5遇见P3口,P1接受该发光二极管,什么时候P1所有的都是高时,,全亮度发光二极管.因为外部中断0和1用同样的方法.这里只是外部中断0计划. #include<reg51. ...

  3. selenium firefox 提取qq空间相册链接

    环境: selenium-java 3.9.1 firefox 57.0 geckodriver 0.19.1 1.大概的思路就是模拟用户点击行为,关于滚动条的问题,我是模拟下拉箭头,否则只能每个相册 ...

  4. 配置ANDROID_HOME

    原文:配置ANDROID_HOME 1.在环境变量中设置一个名为ANDROID_HOME,变量值为SDK路径 2.添加至Path中 备注:ANDROID_HOME的变量值仅允许一个

  5. JavaScript window.location物

    演示样例 注意 方法 常常使用window.location.它的结构总是记不住.简单梳理下.方便以后查询. 演示样例 URL:http://b.a.com:88/index.php? name=ka ...

  6. asp.net中c#求百分比

    double m= 50;double n= 100; Response.Write((m/ (m+ n)).ToString("0%"));Response.Write((m/ ...

  7. Codeforces 85B. Embassy Queue【段树、馋】

    标题效果: 每个人都应该申请签证必须向大使馆3种程序,而这3个步骤做的顺序是固定的.通过各种形式的手续给出多少,它需要对每个过程的处理时间,有多少人会来办理手续,什么时间来.要求的是全部人分别在大使馆 ...

  8. 使用哈希加盐法来为密码加密(补充JAVA的实现)

    使用哈希加盐法来为密码加密 转自:http://www.cnblogs.com/jfzhu/p/4023439.html 转载请注明出处   (一)为什么要用哈希函数来加密密码 如果你需要保存密码(比 ...

  9. PHP关联数组教程

    PHP 数组 关联数组 什么是数组?在使用 PHP 进行开发的过程中,或早或晚,您会需要创建许多相似的变量.无需很多相似的变量,你可以把数据作为元素存储在数组中.数组中的元素都有自己的 ID,因此可以 ...

  10. Leetcode 318 Maximum Product of Word Lengths 字符串处理+位运算

    先介绍下本题的题意: 在一个字符串组成的数组words中,找出max{Length(words[i]) * Length(words[j]) },其中words[i]和words[j]中没有相同的字母 ...