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

LRC 歌词同步

LRC 歌词同步,大家看到了baidu在线歌词同步功能,现在我们也用flash实现lrc歌词同步下载lrc歌词同步显示

 大家也可以把这个文本内容复制下来,然后在“C:\My Player\LRC\”下创建一个文本文档,将内容粘贴上去,再将文档保存为“青花瓷.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://226500.cn";
  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<resultB) return -1;
   return 0;
  }
  amountAry.sort(compare);
  trace(amountAry[0].price);  //输出:50
  trace(amountAry[1].price);  //输出:20
  trace(amountAry[2].price);  //输出:10

补充:flash教程,As3.0
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,