使用音乐api制作在线音乐

最近,打算自己做一个在线音乐播放器。由于诸多条件的限制,我们很难拥有内容丰富的音乐库,所以就不得不“借用”已有的库。

一、使用百度音乐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查询出来的音乐信息还是比较丰富的。

文件的下载:

通过上述文章,我们可以构造出音乐的音频地址,歌词地址,专辑图片等信息。不过音频文件无法直接下载,需要做一些小动作,尝试了一下,目前有效的方法如下:

  1. 到qq音乐的官方网站上随便点播一首歌曲,然后就可以通过构造出来的地址下载音频文件了。
  2. 如果按1所述,每次使用音频文件的时候,都需要到qq音乐官网激活一下,实在太麻烦。通过抓包工具,

我发现请求音频文件时,只要在HTTP请求头中加入特定的Cookie字段,就可以直接使用音频了。具体加哪内容,有兴趣的同志还是自己去抓抓看吧。在制作在线播放器的过程中,仅仅文件的下载遇到了些小问题。其它环节都比较顺利!

附两篇介绍用as播放音乐的文章:

  • http://blog.csdn.net/ecitnet/article/details/1868122
  • http://www.cnblogs.com/zhchongyao/archive/2010/01/26/1656486.html