在Flash中用as实现lrc歌词动态显示

Winplay中可以使用LRC插件来实现歌词的动态显示,在FLASH中也可以[演示],选择一首排行版的歌曲,比较容易看到。
如果你细心,用记事本打开一个LRC文件,他的文件格式如下:

[ti:东风破]
[ar:周杰伦]
[al:叶惠美]
[by:叶泽生]
[offset:500]
[00:00.00]东风破
[00:03.22]
[00:05.46]周杰伦
[00:07.37]詞:方文山 曲:周杰伦
[00:10.27]LRC:叶泽生
[00:12.45]
[00:13.88]一盏离愁孤单伫立在窗口
[00:20.20]我在门后假装你人还没走
[00:26.52]旧地如重游月圆更寂寞
[00:32.98]夜半清醒的烛火不忍苛责我
[00:40.04]一壶漂泊浪迹天涯难入喉
[00:46.47]你走之后酒暖回忆思念瘦
[00:52.93]水向东流时间怎么偷
[00:59.28]花开就一次成熟我却错过
[01:06.31]
[03:50.68][02:58.31][01:09.30]谁在用琵琶弹奏一曲东风破
[03:57.23][03:04.88][01:16.23]岁月在墙上剥落看见小时候
[04:03.55][03:11.11][01:22.58]犹记得那年我们都还很年幼
[04:10.30][03:17.62][01:28.87]而如今琴声幽幽我的等候你没听过
[04:17.07][03:24.50][01:36.08]谁在用琵琶弹奏一曲东风破
[04:23.67][03:30.95][01:42.30]枫叶将故事染色结局我看透
[04:30.02][03:37.35][01:48.88]篱笆外的古道我牵着你走过
[04:36.69][01:55.52]荒烟漫草的年头就连分手都很沉默
[05:01.62][02:07.25][02:15.36]
[02:27.75]一壶漂泊浪迹天涯难入喉
[02:35.15]你走之后酒暖回忆思念瘦
[02:41.54]水向东流时间怎么偷
[02:48.06]花开就一次成熟我却错过
[05:09.43][04:49.63][02:57.23]
[03:43.97]荒烟漫草的年头就连分手都

这个东西如果FLASH读比较麻烦,但如果的VBS的正则表达式就比较方便,将结果输出成下面的样子:

<?xml version="1.0" encoding="GB2312" standalone="yes"?>
<!DOCTYPE MUSIC [
<!ELEMENT MUSIC (ARTIST, TITLE, ALBUM, LANGUAGE, EDITER, OFFSET, LYRICS)>
<!ELEMENT ARTIST (#PCDATA)>
<!ELEMENT TITLE (#PCDATA)>
<!ELEMENT ALBUM (#PCDATA)>
<!ELEMENT LANGUAGE (#PCDATA)>
<!ELEMENT EDITER (#PCDATA)>
<!ELEMENT OFFSET (#PCDATA)>
<!ELEMENT LYRICS (LRC)*>
<!ELEMENT LRC (#PCDATA)>
<!ATTLIST LRC
TAG CDATA #REQUIRED>
]>
<MUSIC>
<ARTIST>周杰伦</ARTIST>
<TITLE>东风破</TITLE>
<ALBUM>叶惠美</ALBUM>
<LANGUAGE></LANGUAGE>
<EDITER>叶泽生</EDITER>
<OFFSET>500</OFFSET>
<LYRICS>
<LRC TAG="0">东风破</LRC>
<LRC TAG="3220"></LRC>
<LRC TAG="5460">周杰伦</LRC>
<LRC TAG="7370">詞:方文山 曲:周杰伦 </LRC>
<LRC TAG="10270">LRC:叶泽生</LRC>
<LRC TAG="12450"></LRC>
<LRC TAG="13880">一盏离愁孤单伫立在窗口</LRC>
<LRC TAG="20200">我在门后假装你人还没走</LRC>
<LRC TAG="26520">旧地如重游月圆更寂寞</LRC>
<LRC TAG="32980">夜半清醒的烛火不忍苛责我</LRC>
<LRC TAG="40040">一壶漂泊浪迹天涯难入喉</LRC>
<LRC TAG="46470">你走之后酒暖回忆思念瘦</LRC>
<LRC TAG="52930">水向东流时间怎么偷</LRC>
<LRC TAG="59280">花开就一次成熟我却错过</LRC>
<LRC TAG="66310"></LRC>
<LRC TAG="69300">谁在用琵琶弹奏一曲东风破</LRC>
<LRC TAG="76230">岁月在墙上剥落看见小时候</LRC>
<LRC TAG="82580">犹记得那年我们都还很年幼</LRC>
<LRC TAG="88870">而如今琴声幽幽我的等候你没听过</LRC>
<LRC TAG="96080">谁在用琵琶弹奏一曲东风破</LRC>
<LRC TAG="102300">枫叶将故事染色结局我看透</LRC>
<LRC TAG="108880">篱笆外的古道我牵着你走过</LRC>
<LRC TAG="115520">荒烟漫草的年头就连分手都很沉默</LRC>
<LRC TAG="127250"></LRC>
<LRC TAG="135360"></LRC>
<LRC TAG="147750">一壶漂泊浪迹天涯难入喉</LRC>
<LRC TAG="155150">你走之后酒暖回忆思念瘦</LRC>
<LRC TAG="161540">水向东流时间怎么偷</LRC>
<LRC TAG="168060">花开就一次成熟我却错过</LRC>
<LRC TAG="177230"></LRC>
<LRC TAG="178310">谁在用琵琶弹奏一曲东风破</LRC>
<LRC TAG="184880">岁月在墙上剥落看见小时候</LRC>
<LRC TAG="191110">犹记得那年我们都还很年幼</LRC>
<LRC TAG="197620">而如今琴声幽幽我的等候你没听过</LRC>
<LRC TAG="204500">谁在用琵琶弹奏一曲东风破</LRC>
<LRC TAG="210950">枫叶将故事染色结局我看透</LRC>
<LRC TAG="217350">篱笆外的古道我牵着你走过</LRC>
<LRC TAG="223970">荒烟漫草的年头就连分手都</LRC>
<LRC TAG="230680">谁在用琵琶弹奏一曲东风破</LRC>
<LRC TAG="237230">岁月在墙上剥落看见小时候</LRC>
<LRC TAG="243550">犹记得那年我们都还很年幼</LRC>
<LRC TAG="250300">而如今琴声幽幽我的等候你没听过</LRC>
<LRC TAG="257070">谁在用琵琶弹奏一曲东风破</LRC>
<LRC TAG="263670">枫叶将故事染色结局我看透</LRC>
<LRC TAG="270020">篱笆外的古道我牵着你走过</LRC>
<LRC TAG="276690">荒烟漫草的年头就连分手都很沉默</LRC>
<LRC TAG="289630"></LRC>
<LRC TAG="301620"></LRC>
<LRC TAG="309430"></LRC>
</LYRICS>
</MUSIC>



采用FLASH的XML读取,他将十分的便捷。

Music_word_arr = new Array();
//新的数组,存放歌词
Music_word_xml = new XML();
//新的XML对象,也就是存放上面所说的XML
Music_word_xml.ignoreWhite = true;
Music_word_xml.onLoad = function(success) {
if (success) {
var tracks_xml = Music_word_xml.firstChild;
var LRC = tracks_xml.childNodes[tracks_xml.childNodes.length-1];
for (var i = 0; i<LRC.childNodes.length; i++) {
var time = LRC.childNodes[i].attributes.TAG;
//获取时间
var geci = LRC.childNodes[i].childNodes;
//获取歌词
Music_word_arr.push({Time:time, Word:geci});
//将时间信息及歌词存在Music_word_arr数组中
}
Show_Word();
//输出
} else {
trace("Error loading MusicWord.");
//如果没有加载,则显示错误
}
delete Music_word_xml;
//删除XML对象
};
Music_word_xml.load(URL);


现在我们该说说如何让歌词与歌曲同步。

还是看代码吧,代码说明一切:

function Show_Word() {
t = 0;
Word.text = "";
music_word = new Object();
//循环对象
music_word.interval = function() {
var zs = mySound.position/100;
if (int(Music_word_arr[t].Time/100) == int(zs)) {
if (Music_word_arr[t].Word == "" || Music_word_arr[t].Word == null) {
Word.text = "";
} else {
Word.text = Music_word_arr[t].Word;
}
t++;
}
if (int(Music_word_arr[t].Time/100)<int(zs)) {
t++;
}
};
music_word_n = setInterval(music_word, "interval", 10);
}

应该很容易看懂,因为不长,值得注意的地方有一个:
if (int(Music_word_arr[t].Time/100)<int(zs)) {
t++;
}

这行代码有什么用?他主要用来解决歌曲播放了,而歌词还没有加载,在这个时候,他就负责让歌词追上歌曲播放进度,而不要让歌曲等他。其实他还有一个更重要的功能,我想做过播放器的人应该都会知道,在这里我就不说了,你自己想想吧,哈哈~~~~~(好象有些不对??¥%¥# 有不明物体降落……啊~!!!!!)

在Flash中用as实现lrc歌词动态显示