写了这么多的博客,关于网络的还不算多,经常有人询问一些关于网络传输、制作在线试听及下载音乐、构造及解析数据等的一些问题,今天就在这里一并讲解。
 
网络操作:
    主要涉及: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. Android官方教程翻译(6)——添加ActionBar

    The action bar allows you to add buttons for the most important action items relating to the app's c ...

  2. 对Java字符串的探究

    问题的出发点 在网上看到一道题: 1 String str = new String("abc"); 以上代码执行过程中生成了多少个 String 对象? 答案写的是两个.&quo ...

  3. 分布式事务slides

    最近看了<分布式系统概念与设计 第 5 版>的分布式事务章节,整理了一份 ppt.还有恢复部分没有收录进来,有空再整理啦. 下面是传到 deckspeaker 上的 slides 展示: ...

  4. ElasticSearch的javaAPI之Client

    翻译的原文:http://www.elasticsearch.org/guide/en/elasticsearch/client/java-api/current/client.html#node-c ...

  5. 在IIS上部署.net core的webapi项目 以及502.5错误的两种解决方法

    首先要在服务器上面安装.net core https://github.com/dotnet/core/tree/master/release-notes/download-archives 这里面有 ...

  6. 使用MVVM DataTriggers在WPF XAML视图之间切换/Window窗口自适应内容大小并居中

    原文 使用MVVM DataTriggers在WPF XAML视图之间切换 相关文章: http://www.technical-recipes.com/2016/switching-between- ...

  7. 正确 C# 未来的期望

    接触 C# 一年.整体上是一个很完好的语言,可是某些细节特征还是不够完美.这里记下我如今对它将来的一些期望. 更强大的泛型约束 与 C++ 的模板相似,C# 的泛型使得编写适用于多种类型的代码更加简洁 ...

  8. SQL Server 2017 正式发布:同时支持 Windows 和 Linux(现在看下来,当年那德拉的“云优先,移动优先”是有远见的,而且是有一系列的措施和产品相配合的,只是需要一点时间而已。真是佩服!!)

    微软在去年 3 月首次对外宣布了 Linux 版的 SQL Server,并于今年 7 月发布了首个公开 RC 版.前几日在美国奥兰多召开的微软 Ignite 2017 大会上,微软宣布 SQL Se ...

  9. matlab 各种文件的读取(及读写问题的解决)

    0. 文本文件 load('**.mat') load('**.mat', '-ascii') load('-mat', filename) load('-ascii', filename) 1. 音 ...

  10. 在Android程序中使用Modbus协议时报 java.net.SocketException: recvfrom failed: ECONNRESET解决办法

    最近在开发基本Modbus协议的Android端PLC控制程序,C#版程序没有任何问题,移到JAVA下出现各种问题,其中比较苦恼的是java.net.SocketException: recvfrom ...