LRC 歌词同步,大家看到了baidu在线歌词同步功能,现在我们也用flash实现lrc歌词同步下载和lrc歌词同步显示
大家也可以把这个文本内容复制下来,然后在“C:My PlayerLRC”下创建一个文本文档,将内容粘贴上去,再将文档保存为“青花瓷.lrc”,注意扩展名是“.lrc”。
二、LRC 内容分析
准备工作完成了,下面分析一下这个 LRC 文件。之所以叫 LRC ,是因为它是 Lyric (歌词) 的缩写。这种格式真是一目了然,前面“[ ]”中的数字表示其后歌词的开始时间。例如,“[01:50.25]色白花青的景已跃然于碗底”表示在1分50.25秒时,歌词内容是“色白花青的景已跃然于碗底”。
还有一种形式是“[03:01.92][02:25.63][00:56.90]天正在等烟雨”这种形式常用于赋格部分(俗称:歌曲的高潮部分),它表示在 03:01.92, 02:25.63, 00:56.90 时的歌词都是“天正在等烟雨”。由于这种形式的存在,使后面的编程稍显复杂,不过没关系,凭借各位的聪明智慧一定没问题。
三、预备知识
1. ActionScript 3 中默认使用 Unicode 来解码外部文件,如果读取的文本不是 Unicode 编码,而是按照操作系统代码页编写的,比如 GB2312,那么需要先导入 flash.system.System 类,并在加载外部文本的语句前将 System.useCodePage 设为 true,默认情况下为 false,即默认不使用操作系统页解码。
如果 System.useCodePage = false 且外部 LRC 文件编码格式是 ANSI 的话,那么显示的中文歌词会是乱码。解决办法有两个:一是,将外部 LRC 文件编码格式改为 Unicode;二是,不改变外部文件编码格式,只在文档类中加入一句 System.useCodePage=true 即可。由于后一种方法使用简便,我们就采用第二种方法。
2.读取声音:
var sound:Sound=new Sound();
sound.load(new URLRequest("Music/青花瓷.mp3"));
3.播放声音及获取当前播放时间(毫秒):
var sc:SoundChannel;
var sound:Sound=new Sound();
sound.load(new URLRequest("Music/青花瓷.mp3"));
sc=sound.play();
stage.addEventListener(Event.ENTER_FRAME,EnterFrame);
function EnterFrame(evt:Event):void {
trace(sc.position);
}
这里将 sc 声明为全局变量(或类变量),因为在多个方法中都要使用它。
4.读取外部文件:
var loader:URLLoader=new URLLoader();
loader.load(new URLRequest("LRC/青花瓷.lrc"));
loader.addEventListener(Event.COMPLETE,LoadFinish);
function LoadFinish(evt:Event):void {
trace(evt.target.data);
}
5.将字符串按分隔符分隔为数组(String.split):
var str:String="FL Basic Theory Master";
var array:Array=str.split(" ");
trace(array);
//输出数组:[[FL],[Basic],[Theory],[Master]]
str=" http://111com.net";
array=str.split(".");
trace(array);
//输出数组:[[http://blog],[sina,com],[cn/yyy98]]
6.简单的正则表达式应用:
1>获取匹配次数:
var Pattern:RegExp=/Window/g;
//意思是所有名为“Window”的字符串
var str:String="Windows seems like a Window, so called Windows OS! ";
trace(str.match(Pattern).length)
//结果:3
2>获取正确匹配:
var foo:RegExp=/[0-3][0-9]/[0-1][0-9]/[0-2][0-9][0-9][0-9]/g;
//意思是所有格式为“日/月/年”的字符串
var str:String="Date Format: 2006/12/25 2006-12-25 12/25/2007 25/12/2007"
trace(str.match(foo))
//结果:25/12/2007
7.字符串取子串操作(String.substr):
var str:String="[03:01.92][02:25.63][00:56.90]天正在等烟雨";
trace(str.substr(0,30));
//从0号索引开始,取30个字符
//结果:[03:01.92][02:25.63][00:56.90]
trace(str.substr(30));
//只写一个参数,表示从该索引处到字符串结束位置
//结果:天正在等烟雨
8.数组排序中比较函数的应用:
var a:Object={price:20,number:3};
var b:Object={price:10,number:7};
var c:Object={price:50,number:1};
var amountAry:Array=[a,b,c];
function compare(paraA:Object,paraB:Object):int {
var resultA =paraA.price*paraA.number;
var resultB =paraB.price*paraB.number;
if (resultA>resultB) return 1;
if (resultA
}
amountAry.sort(compare);
trace(amountAry[0].price); //输出:50
trace(amountAry[1].price); //输出:20
trace(amountAry[2].price); //输出:10