MP3播放器教程之一:LRC歌词分析
很多网友对我之前发的MP3播放器很兴趣...于是准备写一个教程,把里边用到了一些功能详细介绍一下...
这一节我们先介绍下LRC歌词的读取与显示。
原理:
其实lrc文件不过是固定格式的一个文本文档。
由
[时间]歌词
或
[时间][时间...]歌词
这样的形式保存
那么先以换行符分割行,再以"]"分割歌词与时间。把歌词与时间整理存进数组就可以了。
代码:直接看代码吧
function getlrc(path) {
//定义两个数组,mylrc用过分析过程使用.newlrc为最终保存歌词的数组
newlrc = new Array();
mylrc = new Array();
//加载外部lrc文件
lrc = new LoadVars();
lrc.load(path);
lrc.onData = function(str) {
//判断是否加载成功
if (str != undefined) {
//以“换行符”分割歌词保存在mylrc中
mylrc = str.split(chr(13)+chr(10));
//循环每一行...
for (i=0; i<mylrc.length; i++) {
if (mylrc[i].substr(0, 3) == "[ti") {
//包含"[ti"为歌名,暂时不需要使用,备注掉,下同//
//var temp = mylrc[i].split(":")[1];
//temp = temp.substr(0, temp.length-1);
//newlrc.push("00:00.00|歌名:"+temp);
} else if (mylrc[i].substr(0, 3) == "[ar") {
//演唱//
//var temp = mylrc[i].split(":")[1];
//temp = temp.substr(0, temp.length-1);
//newlrc.push("00:00.01|演唱:"+temp);
} else if (mylrc[i].substr(0, 3) == "[al") {
//专辑//
//var temp = mylrc[i].split(":")[1];
//temp = temp.substr(0, temp.length-1);
//newlrc.push("00:00.02|专辑:"+temp);
} else if (mylrc[i].substr(0, 1) == "[") {
//正常的歌词
var temp:Array = mylrc[i].split("]");//判断是不是同时有两个或以上的时间(有时候一句歌词出现几次就会有这种情况)
if (temp.length == 2) {//只有一句歌词
newlrc.push(deleteStr(temp[0])+"|"+temp[1]);//加入数组
} else if (temp.length>2) {//有两句以上的歌词
for (k=0; k<temp.length-1; k++) {
newlrc.push(deleteStr(temp[k])+"|"+temp[temp.length-1]);//加入数组
}
}
//ps:这里保存歌词数组的方法有两种:
//newlrc["00.00.0"] = "歌词"
//newlrc[0]="00.00.0|歌词"
//对只歌词一条一条显示的情况.第一种方法更为方便
//对于列表显示的情况,第二种更为方便
}
}
}
if (newlrc.length<1) {//加载不成功或分析不成功.
newlrc.push("00.00.0|找不到歌词");
}
newlrc.push("99.99.9|欢迎使用i4cd mp3player");
newlrc.sort();//进行时间排序,如果只需要一条一条显示,不使用也可
//以下代码只是把歌词显示出来,非必要
txtArea.text = "";
for (i=0; i<newlrc.length; i++) {
txtArea.text += newlrc[i].split("|")[1]+"\n";
}
};
}
function deleteStr(str) {//删除多余的[]
var temp:String = str;
return (temp.substr(1, temp.length-1));
}
function getStr(str, num) {//返回指定格式的时间文本
var temp:String = str;
if (temp.length<num) {
temp = temp+".00";
}
return (temp.substr(0, num));
}
代码没怎么优化,写得挺乱了,别见怪 用时直接用:
getlrc(lrc文件路径就可以了)
歌词会保存在一个叫newlrc的数组里.当然改一下做成返回数组也可以,这样按大家发挥就可以了
注意:由于swf不可以跨域读取外部文件(了解安全性 > 关于域、跨域安全性和 SWF 文件)
默认情况下,Flash Player 7 和更高版本防止从一个域提供的 SWF 文件读取从另一个域提供的 SWF 文件的数据、对象或变量。另外,通过不安全的(非 HTTPS)协议加载的内容不能读取通过安全的 (HTTPS) 协议加载的内容,即使两者都在完全相同的域中。例如,未经显式许可,位于 http://www.macromedia.com/main.swf 的 SWF 文件不能加载 https://www.macromedia.com/data.txt 中的数据;从一个域提供的 SWF 文件也不能加载另一个域的数据(例如使用 loadVars()
)。
这个问题的解决方法,可以在swf所在的域中用动态语言(.net/asp/php/jsp)等把域上的lrc读进来再传给flash.或者直接就把歌词存在自己空间里。
好了,分析歌词就说到这里,下一步我们会介绍歌词与mp3同步...
补充:flash教程,动画技术