当前位置:软件学习 > Flash >>

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教程,动画技术 
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,