调研问题:
多个音乐播放SDK调研,包括百度音乐,喜马拉雅,QQ音乐,网易云音乐,酷狗音乐。主要从以下两个方便进行调研:
1.是否存在相关SDK开发包
2.能否获取歌曲的播放列表,或者唱片相关的信息,比如封面,出版年份,歌手身份信息及歌手其他专辑等
3.歌曲链接是否固定不变
4.调用不同的音乐sdk(百度音乐和喜马拉雅)播放歌曲时是否存在冲突
5.喜马拉雅音乐的优劣
调研结果:
1.有SDK开发包:
* 喜马拉雅提供了Android和IOS端的SDK开发包,可以获取专辑或声音的标签,也可以获取某个分类标签下的热门专辑列表/最新专辑列表/最多播放专辑列表等,其中Android和IOS端的下载链接如下:
Android:http://open.ximalaya.com/sdk/android
IOS:http://open.ximalaya.com/sdk/ios
2.无SDK开发包
(1)百度音乐: 没有公开的API或者相关的SDK,有人通过分析听歌时向浏览器发出的Get请求从而得出隐藏的调用百度音乐的API,可以参考如下链接:
http://www.programering.com/a/MjN2czNwATc.html
http://www.jianshu.com/p/a6718b11fdf1
(2)QQ音乐:没有公开的API或者相关的SDK,在SHOWAPI网站上找到了经过整理的QQ音乐接口[https://www.showapi.com/api/lookPoint/213],但是这个接口有请求次数的限制。也有其他人hack的API接口http://www.oschina.net/code/snippet_60100_53041,比如根据关键字搜索相关的歌曲(获取对应的歌曲真实链接和唱片图片部分不可用,下文给出了其他方法)。获取歌曲信息的例子如下:
其中最后的“w=北京欢迎你”表示搜索的关键字w是“北京欢迎你”。返回的数据如下(截取部分,只包含搜索结果的第一首歌曲):
{
"code": 0,
"data": {
"keyword": "北京欢迎你",
"priority": 0,
"qc": [],
"semantic": {
"curnum": 0,
"curpage": 1,
"list": [],
"totalnum": 0
},
"song": {
"curnum": 5,
"curpage": 1,
"list": [
{
"albumName_hilight": "民歌红 3",
"chinesesinger": 0,
"docid": "5102957786187525786",
"f": "7168385|北京欢迎你|12509|龚玥|74805|民歌红3|2490176|288|5|1|1|11556771|4622828|320000|0|33827090|34538333|6901601|7211965|0|000mbXqI3WE5bM|000jqHMB1iLuTg|002fPKiQ0tsT4J|31|0",
"fiurl": "",
"fnote": 0,
"fsinger": "龚玥",
"fsinger2": "",
"fsong": "北京欢迎你",
"grp": [],
"isupload": 0,
"isweiyun": 0,
"lyric": "",
"lyric_hilight": "",
"mv": "o0090Ibzqoz",
"nt": 10000,
"only": 0,
"pubTime": 1227801600,
"pure": 0,
"singerMID": "000jqHMB1iLuTg",
"singerMID2": "",
"singerName2_hilight": "",
"singerName_hilight": "龚玥",
"singerid": 12509,
"singerid2": 0,
"songName_hilight": "北京欢迎你",
"t": 1,
"tag": 10,
"ver": 0
},
......
其中“"f": "7168385|北京欢迎你|12509|龚玥|74805|民歌红”字段中的“7168385”表示搜索结果中对应歌曲的id。
歌曲的真实链接为http://tsmusic24.tc.qq.com/{$song_id}.mp3,其中{$song_id}为歌曲的id,替换为7168385后即可下载对应的mp3歌曲或者在线试听。
(3)网易云音乐:没有公开的API或者相关的SDK,有hack的到的API,已被作者托管在了Github上,但是快两年没更新了,网易云音乐期间做了一些改动,该API已不可用。不过作者的分析结果可以借鉴,详情参考:https://github.com/yanunon/NeteaseCloudMusic/wiki/%E7%BD%91%E6%98%93%E4%BA%91%E9%9F%B3%E4%B9%90API%E5%88%86%E6%9E%90
(4)酷狗音乐:没有公开的API或者相关的SDK,有hack得到的API,可以获取根据搜索的关键字(专辑名,歌曲名,歌手等)获取相关的音乐列表,从而获取到真实的m4a音频文件播放的地址。相关代码开源在了csdn上:https://code.csdn.net/flc1125/kugou-api/tree/master(代码是PHP写的,推荐在线测试链接:http://www.shucunwang.com/RunCode/php/)。并且该作者也利用该代码搭建了一个听歌的网页:http://music.flc.ren/index,其中获取歌曲列表部分的API有问题,但是获取相应歌曲的API可以正常使用。比如根据获取的歌曲列表中的hash值播放《恋人心》这首歌,可以浏览器访问http://m.kugou.com/app/i/getSongInfo.php?hash={hash}&cmd=playInfo,其中hash值替换为:0e21484e530e62cb1517a4ad2107181d,可以得到如下结果:
{"privilege":0,"bitRate":128,"extra":{"320filesize":8323730,"sqfilesize":23650202,"sqhash":"afc91d4d035a80c0079d4be482ca3de7","128hash":"0e21484e530e62cb1517a4ad2107181d","320hash":"1bd5672076da319baacc0142134adcc7","128filesize":3329238},"status":1,"hash":"0E21484E530E62CB1517A4AD2107181D","stype":11323,"errcode":0,"error":"","fileName":"魏新雨 - 恋人心","fileSize":3329238,"singerHead":"","url":"http:\/\/fs.open.kugou.com\/443c8db1a495acb4fde450515ea7545f\/57996e05\/G028\/M08\/0D\/17\/_JMEAFWeQDKIbSriAAy-1jvr7rcAAA9HwMKWEkADL7u175.m4a","extName":"m4a","ctype":1009,"timeLength":208}
3.歌曲链接是否固定
目前主要包含两种方案:
(1)歌曲的url是固定不变的,一般包含两种:
歌曲链接中不会直接包含真实的歌曲名称,而是歌曲名称的hash值或者由歌曲的id和经过特定算法加密后的一串字符。比如酷狗音乐中获得的非公开的API的歌曲url。
获取的url是一串乱码,字符经过特定的算法组合,一般无法直接得出真实的url,需要对字符串进行解码。比如2011年前用虾米音乐听歌时服务返回的歌曲绝对地址是:
8h2xt912653.tFi%%959E5mt%a22%2457pp2mFF2%%%%3%Fi23F55553f.371EEEEA1n21412_1%.e51%7%18
看起来很奇怪的一串字符,类似于下面的方针:
采用的对歌曲url进行矩阵操作(目前已开放API),
8 //类似凯撒方阵的列数(以下列8字符)
h2xt912653.
tFi%%959E5m
t%a22%2457p
p2mFF2%%%%3
%Fi23F55553
3f.371EEEE
A1n21412_1
%.e51%7%18
把这串字符竖起来读就是下面这种样子了:
http%3A%2F%2Ff1.xiami.net%2F23259%2F371119%2F14%252%5E17694%5E2%5E5%5E_1357%5E18.mp33
接着再解码一下:
http://f1.xiami.net/23259/371119/14%2^17694^2^5^_1357^18.mp33
还是有些奇怪,把^ 替换为 0,得到真实的固定的歌曲地址:
http://f1.xiami.net/23259/371119/14%201769402050_1357018.mp3
(以上内容参考自https://kanoha.org/2011/08/30/xiami-absolute-address/)
(2)歌曲的地址不固定
服务器返回给客户端的歌曲地址是随机的,比如网易云音乐。通过查看github上其他人分享的解析网易云音乐的源码(https://github.com/darknessomi/musicbox)以及darknessomi(https://github.com/darknessomi/musicbox/wiki/%E7%BD%91%E6%98%93%E4%BA%91%E9%9F%B3%E4%B9%90API%E5%88%86%E6%9E%90)对其的进一步解析可以发现网易云音乐在返回给用户的歌曲地址经过了加密,并且每次用户的每次请求得到的地址都不相同,每个地址在过了一段时间以后(大约半个小时左右)会失效。下图为多次获取id为27902910的歌曲地址时服务器返回的结果:
以“http://m10.music.126.net/20160729154255/140cb0217a8d78e2961eb324199ab405/ymusic/b022/7457/0536/77357411f4cbe4f1552aecf06dec89d7.mp3”为例,其中每次请求时变化的部分为“20160729154255/140cb0217a8d78e2961eb324199ab405”,“20160729154255”主要包含年月日时分秒,指的是歌曲地址的过期时间,“140cb0217a8d78e2961eb324199ab405”这部分由服务器随机生成。个人猜测多个链接应该是对应着物理磁盘上的同一个文件,服务器在一段时间内(比如半个小时)保存生成相应歌曲地址的随机数,在用户有播放音乐的请求时在对歌曲地址进行解密,取出其对应的绝对物理地址。
4.测试demo(Android)
目前主要是调用的QQ音乐的非公开的API,可以通过查询关键字查找相应的歌手或者歌曲,默认只显示10条以内的结果。歌曲信息部分为通过API接口返回的json格式的查询信息,歌曲列表(解析)为解析后的歌曲id,歌曲名称,歌手名称结果,最多显示10条,通过选取列表框中的歌曲病点击播放按钮可以进行歌曲试听。 软件界面如下:
软件apk链接:app-debug.apk
AS工程源码:MusicDemo.zip
5.不同的音乐sdk之间是否会存在冲突
目前主要测试了百度音乐的sdk和喜马拉雅的sdk,两者在播放在线歌曲时不存在冲突,比如调用百度音乐播放在线音乐的接口播放“千千阙歌”,调用喜马拉雅的播放接口播放一段有声读物,可以从手机的扬声器中同时听到歌曲和有声读物的内容,两者之间分别暂停或者退出均不影响。本次主要测试的是android版本的sdk,这两种音乐sdk中均对android系统内的MediaPlayer进行了封装。
下面的Demo中整合了百度音乐的sdk和喜马拉雅的sdk,Demo的主页面的上面部分为百度音乐,下面部分为喜马拉雅音乐。其中百度音乐的接口中固定了几首歌的id,可以通过点击“next”按钮进行切换。喜马拉雅中可以通过点击试听不同的有声读物。界面如下:
Demo的代码和测试apk如下:
6.喜马拉雅音乐的优劣
优点:目前免费接入,有声节目资源丰富
缺点:(1)音乐资源不足
(2)音频资源中会插入广告,以下是开发文档中关于音乐播放流程中插入广告的说明: