1、相关文章:Flash AS3 用于读取 LRC 同步歌词的类。一、准备工作既然要制作歌词同步程序,首先要准备一首歌,我们就以“周杰伦-青花瓷”为例。首先要下载这首“青花瓷.mp3” ,保存为“C:My PlayerMusic青花瓷.mp3 ”。还要下载青花瓷的 LRC 文件,大家可以到网上下载(地址见附录) ,将文本内容保存为“C:My PlayerLRC青花瓷 .lrc”。我们的程序(类和 FLA)则保存在“C:My Player”文件夹下。青花瓷.lrc 文件:-ti:青花瓷ar:周杰伦al:我很忙by:张琪00:00.00发送短信 18 到 291199 下载该歌曲到手机00:01.11
2、青花瓷03:36.4900:21.39素眉勾勒秋千话北风龙转丹 00:26.08屏层鸟绘的牡丹一如你梳妆00:30.46黯然腾香透过窗心事我了然 00:34.93宣纸上皱边直尺各一半00:39.49油色渲染侍女图因为被失藏 00:43.83而你嫣然的一笑如含苞待放00:48.30你的美一缕飘散 00:50.77去到我去不了的地方02:23.9700:55.7703:01.9202:25.6300:56.90天正在等烟雨 03:03.5702:27.9100:58.99而我在等你 03:05.9202:30.4401:00.93炊烟袅袅升起 03:07.7602:32.2501:03.49隔江千
3、万里03:10.3602:34.8501:05.84在平地书刻你房间上的飘影 03:14.6702:38.7301:09.87就当我为遇见你伏笔03:18.8302:43.3501:14.34天正在等烟雨 03:21.2002:45.6001:16.68而我在等你 03:23.7102:48.0101:18.99月色被打捞起 03:25.7402:50.1001:21.18掩盖了结局03:28.3302:52.5401:23.72如传世的青花瓷在独自美丽 03:32.3002:56.6701:27.65你眼的笑意01:50.25色白花青的景已跃然于碗底 01:54.69临摹宋体落款时却惦记着你
4、01:59.22你隐藏在药效里一千年的秘密 02:03.75急溪里犹如羞花沾落地02:08.32林外芭蕉 惹咒语 02:10.57梦幻的铜绿02:12.84而我路过那江南小镇的等你02:17.19在泼墨山水画里 02:19.75你从墨色深处被隐去-大家也可以把这个文本内容复制下来,然后在“C:My PlayerLRC”下创建一个文本文档,将内容粘贴上去,再将文档保存为“青花瓷.lrc” ,注意扩展名是“.lrc ”。二、LRC 内容分析准备工作完成了,下面分析一下这个 LRC 文件。之所以叫 LRC ,是因为它是 Lyric (歌词) 的缩写。这种格式真是一目了然,前面“ ”中的数字表示其后歌
5、词的开始时间。例如, “01:50.25色白花青的景已跃然于碗底”表示在 1 分 50.25 秒时,歌词内容是“色白花青的景已跃然于碗底” 。还有一种形式是“03:01.9202:25.6300:56.90天正在等烟雨”这种形式常用于赋格部分(俗称:歌曲的高潮部分) ,它表示在 03:01.92, 02:25.63, 00:56.90 时的歌词都是“天正在等烟雨” 。由于这种形式的存在,使后面的编程稍显复杂,不过没关系,凭借各位的聪明智*四、LRC 的读取与存储转换(使用文档类设计)1.读取 LRC 文件,这一步非常简单与读取普通的文本文件是一样的; CODE:public function
6、LRCPlayer() var loader:URLLoader=new URLLoader();loader.load(new URLRequest(“LRC/青花瓷.lrc“);loader.addEventListener(Event.COMPLETE,LoadFinish);private function LoadFinish(evt:Event):void trace(evt.target.data);-2.将读取的 LRC 数据按行分割( “n“ 为换行符) ,数组的每一个元素代表 LRC 的一行内容; CODE:function LoadFinish(evt:Event):vo
7、id var list:String=evt.target.data;var listarray:Array=list.split(“n“);trace(listarray);-3.在数组中提取每一行的时间及歌词,解决单时间序列的问题;(注意!此段代码只作讲解,不以应用)LRC 内容如下: QUOTE:00:43.83而你嫣然的一笑如含苞待放00:48.30你的美一缕飘散 00:50.77去到我去不了的地方03:01.92天正在等烟雨 03:03.57而我在等你 03:05.92炊烟袅袅升起 03:07.76隔江千万里代码如下: CODE:function LoadFinish(evt:Eve
8、nt):void var list:String=evt.target.data;var listarray:Array=list.split(“n“);for (var i=0; iparaB.timer) return 1;if (paraA.timerparaB.timer) return 1;if (paraA.timerparaB.timer) return -1;return 0;六、*无处不在的优化至此,该程序已经可以顺利执行了,此处只讨论一下优化问题,看不懂可以跳过。以这段代码为例: CODE:function SoundPlaying(evt:Event):void for
9、(var i=1; iLRCarray.length; i+) if (sc.positionLRCarrayi.timer) lrc_txt.text=LRCarrayi-1.lyric;break;lrc_txt.text=LRCarrayLRCarray.length-1.lyric;如果要进行优化,那么这个 for 循环,应该写成: CODE:for (var i=1,j=LRCarray.length; ij; i+) 这样在执行判断时,不必每次都进行 LRCarray.length 操作,该操用于读取数组长度,执行 Array 类的 length 方法,属于高级操作,花费的时间要比
10、低级操作多。其实,只要读取一次长度,然后将结果保存在变量 j 中,每次判断时读取 j 的值即可。取值与赋值都属于低级别的操作,速度较快。同样的道理,在 CODE:if (sc.positionLRCarrayi.timer) 中的 sc.position 在每次判断时都要读取一遍,这时就应将它在循环之前保存到一个变量里,这段代码优化后应是这样: CODE:function SoundPlaying(evt:Event):void var now:Number=sc.position;for (var i=1,j=LRCarray.length; ij; i+) if (nowLRCarrayi
11、.timer) lrc_txt.text=LRCarrayi-1.lyric;break;lrc_txt.text=LRCarrayj-1.lyric;在我们的文档类中还有几个地方用到了 for 循环,请大家按照上述方法自行优化。其实,代码优化无处不在,其中的学问不胜枚举,有兴趣的朋友可以到我的博客中看一下关于代码优化的总结贴,见附录。七、附录1 LRC 文件下载地址:http:/ MP3 的下载,我想大家比我在行,用百度或酷狗都可以。3代码优化总结贴地址:http:/ 、FLA 文件)打包下载:http:/ 谢谢合作)上一篇文章: 优化 Flash Actionscript 代码的三种方法-Flash actionscript下一篇文章: Flash as3:绝对坐标与相对坐标-Flash actionscript