集成多个音乐播放SDK调研

调研问题:

       多个音乐播放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,比如根据关键字搜索相关的歌曲(获取对应的歌曲真实链接和唱片图片部分不可用,下文给出了其他方法)。获取歌曲信息的例子如下:

http://s.music.qq.com/fcgi-bin/music_search_new_platform?t=0&n=5&aggr=1&cr=1&loginUin=0&format=json&inCharset=GB2312&outCharset=utf-8¬ice=0&platform=jqminiframe.json&needNewCode=0&p=1&catZhida=0&remoteplace=sizer.newclient.next_song&w=北京欢迎你

其中最后的“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}

其中http://fs.open.kugou.com/a3868713bb1cc9b42950c56510ff284b/57997517/G008/M03/09/01/SA0DAFUOKIuITL3KAAZC9_483O0AABByQObwfAABkMP188.m4a时该歌曲的下载链接。


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如下:

TingPhoneSDKTest-debug.apk

TingPhoneSDKTest.zip

6.喜马拉雅音乐的优劣

    优点:目前免费接入,有声节目资源丰富

    缺点:(1)音乐资源不足

               (2)音频资源中会插入广告,以下是开发文档中关于音乐播放流程中插入广告的说明:


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,799评论 25 707
  • 我们都曾经讨论过这样的一个话题:爱你的人和你爱的人,你会选择哪个来与你相伴终生呢?每个人的回答都是不一样的。有...
    温柔你不懂得爱阅读 596评论 0 4
  • 郭相麟 站在艺术的殿堂 看那一幅幅 惟妙惟肖的作品 一把剪刀 一张纸 一颗理解生活 热情奔放的心灵 剪出来的艺术人...
    郭相麟阅读 183评论 0 0
  • 大家对于通过控制饮食来达到减肥的效果首先想到的就是控制肉类的摄入,因为其中含有脂肪容易使体重增加,而忽视了对糖...
    阿瑶374534阅读 227评论 0 0