最近,打算自己做一个在线音乐播放器。由于诸多条件的限制,我们很难拥有内容丰富的音乐库,所以就不得不“借用”已有的库。
一、使用百度音乐API
在网上搜了一下,人们谈论最多的就是百度的音乐API,例如,于是我从它开始下手!
在前端,用flex的flash.media.Sound类做一个简单的音乐并不难,按照http://www.cocoachina.com/bbs/read.php?tid=56351 所述,我可以成功地获取音乐链接,然后使用flex中的flash.media.Sound;类,便可以制作一款简单的音乐播放器。在本地调试了一下,可以正常播放。但当我把swf文件放到服务器上的时候,问题就来了。因为swf需要从其它服务器请求音乐,因此存在一个跨域的问题。面对跨域,需要一个小小的欺骗。服务器,而不是客户端直接向资源服务器发出请求,如果服务器能够获取音乐资源,则将资源转发给客户端。这样就绕过了跨域的问题。简单的php示例代码如下:
<?php $port = 80;//音乐服务器的端口 $host = "zhangmenshiting.baidu.com";//音乐服务器的域名 $path = /data2/music/5826953/5826953.mp3?xcode=cb3507c36b39f05ba79c7fd72cefb648&mid=0.66583758379152;//音乐的具体路径 function getMusic($host,$path,$port) { $fp = fsockopen($host,$port); if (!$fp) { echo "Failed to open socket to $url"; // 创建socket 失败 exit; } //开始写入HTTP header 头信息,绕过跨域问题的关键 fputs($fp, "GET {$path} HTTP/1.1\r\n"); fputs($fp, "{$host}\r\n"); fputs($fp, "Connection: close\r\n"); fputs($fp,"\r\n"); //开始接受返回数据 $line = fgets($fp,1024); // 定义一个标志位,标记当前读取的行是否是 head 头信息部分 $inheader = 1; //继续读取HTTP 协议的请求结果 $infoLen = 0; $revInfoLen = 0; //将读取的数据转发客户端 while(!feof($fp)) { $line = fgets($fp,1024); if ($inheader == 1) { if ($line != "\n" && $line != "\r\n") { $header_str = str_replace("\r","",$line); $header_str = str_replace("\n","",$header_str); header($header_str); //向客户端发HTTP头 } } if ($inheader && ($line == "\n" || $line == "\r\n")) { // HTTP头设置结束 $inheader = 0; }elseif (!$inheader) { echo $line;//想客户端转发具体的数据 } } fclose($fp); // 关闭socket } ?>
在实际的使用过程中,我发现此音乐API并不那么好用。首先,返回的信息实在有限,除了一个加密过的音乐链接外,就没什么了。其次,百度音乐api似乎存在地址失效的问题,获取的链接过一段时间就失效了。这很不利于音乐的收藏和保存。没办法,谁让音乐是偷来的呢,虽然百度的音乐库很丰富,只好忍痛放弃了。
二、使用QQ音乐API
还有一些热心程序猿将qq的API分析出来了。例如:
- http://www.cocoachina.com/bbs/read.php?tid=115028
- http://bbs.uc.cn/thread-1781683-1-1.html
虽然QQ的音乐库比较小,但是API查询出来的音乐信息还是比较丰富的。
文件的下载:
通过上述文章,我们可以构造出音乐的音频地址,歌词地址,专辑图片等信息。不过音频文件无法直接下载,需要做一些小动作,尝试了一下,目前有效的方法如下:
- 到qq音乐的官方网站上随便点播一首歌曲,然后就可以通过构造出来的地址下载音频文件了。
- 如果按1所述,每次使用音频文件的时候,都需要到qq音乐官网激活一下,实在太麻烦。通过抓包工具,
我发现请求音频文件时,只要在HTTP请求头中加入特定的Cookie字段,就可以直接使用音频了。具体加哪内容,有兴趣的同志还是自己去抓抓看吧。在制作在线播放器的过程中,仅仅文件的下载遇到了些小问题。其它环节都比较顺利!
附两篇介绍用as播放音乐的文章:
- http://blog.csdn.net/ecitnet/article/details/1868122
- http://www.cnblogs.com/zhchongyao/archive/2010/01/26/1656486.html
悠悠我心,宁静如水