標準歌詞文件范例:
[ti:黑色幽默] [ar:周杰倫] [al:Jap] [by:歌詞吾愛http://www.51lrc.com] [offset:400] [00:02.00]詞/曲:周杰倫 [00:05.49]歌詞吾愛 [00:09.48]http://www.51lrc.com [00:15.84]難過 是因為悶了很久 [00:21.18]是因為想了太多 [00:24.91]是心理起了作用 [00:30.89]你說 苦笑常常陪著你 [00:36.13]在一起有點勉強 [00:39.83]該不該現(xiàn)在休了我 [02:45.62][00:44.86]不想太多 [02:47.71][00:47.41]我想一定是我聽錯弄錯搞錯 [02:53.55][00:53.28]拜托 我想是你的腦袋有問題 [03:00.53][01:00.11]隨便說說 [03:04.49][01:02.47]其實我早已經(jīng)猜透看透不想多說 [03:12.19][01:09.94]只是我怕眼淚撐不住 [03:16.31][01:15.77]不懂 你的黑色幽默 [03:23.51][01:23.25]想通 卻又再考倒我 [03:30.61][01:30.63]說散 你想很久了吧? [03:37.92][01:37.72]我不想拆穿你 [03:46.16][01:45.85]當作 是你開的玩笑 [03:53.54][01:53.22]想通 卻又再考倒我 [04:16.74][04:01.06][02:00.76]說散 你想很久了吧?
[04:23.15]我的認真敗給黑色幽默
結(jié)構(gòu)分析: 1、文件頭是記錄歌詞信息的文字,下面就是時間跟歌詞內(nèi)容的信息了。 2、每一行都是由一到幾個用中括號標記的時間值及該時間要顯示的歌詞內(nèi)容組成。 如:[04:07.94][02:07.79]敗給你的黑色幽默,代表在2分7秒79跟4分7秒94都顯示"敗給你的黑色幽默"這句歌詞。
了解了LRC文件的結(jié)構(gòu)后,就可以利用AS強大的字符串處理功能,把里頭包含的一些變量值提取出來。
從范例可見: 歌詞文件以行為單位,所以先把文本每行的字符串分別存于一個變量中,但是變量數(shù)目不確定,所以就把變量存于數(shù)組中。
在LOADLYRICS函數(shù)里追加代碼:
var OriginLyrics=new Array();//創(chuàng)建一個存放每行歌詞的數(shù)組對象 OriginLyrics=lyricsString.split(chr(10))//把字符串分析為數(shù)組,分隔符為chr(10)+chr(13)(關(guān)于這個分隔符,筆者其實還是比較模糊,筆者開始不知道歌詞在換行的時候是用了回車符還是換行符.這個分隔符CHR(10)是筆者經(jīng)過多次嘗試后得出來的). for (var i in originLyrics) { if (originLyrics[i] == "") { originLyrics.splice(i, 1); } }//歌詞文件里可能有些行是沒內(nèi)容的,這些先刪除,以免對后面的分析造成影響。
但是,我們還發(fā)現(xiàn),有些行是多個時間,只有一句歌詞.其實這是LRC的壓縮格式,為了統(tǒng)一,我們還需要對這些壓縮的部分進行"解壓",使得每行的組成都是一個時間對應一句歌詞。
所以,再定義一個新數(shù)組originLyricsBreak,放置解壓后的歌詞:
下面將以歌詞"[04:07.94][02:07.79]敗給你的黑色幽默"為例,解釋解壓歌詞的代碼:
var originLyricsBreak=new Array(); for (var i in originLyrics) { var originLyricsUnit = originLyrics[i].split("]");//把每行處理為長度為N的數(shù)組,里頭包含(N-1)個時間信息和一個歌詞信息. //例句中的歌詞將分為一個長度為3的數(shù)組:三項的內(nèi)容:[04:07.94,[02:07.79,和敗給你的黑色幽默 for (i=0; i<=originLyricsUnit.length-2; i++) {//數(shù)組下標最大值等于(數(shù)組長度-1),這里之用originLyricsUnit.length-2,是因為要把數(shù)組的時間信息枚舉出來,而最后一項是歌詞信息 originLyricsBreak.unshift(originLyricsUnit[i]+"]"+originLyricsUnit[originLyricsUnit.length-1]);//往ORIGINLYRICSBREAK數(shù)組添加一個歌詞項,其中包括一個時間信息和相應的歌詞內(nèi)容 } //經(jīng)過一次循環(huán)后,ORIGINLYRICSBREAK添加了兩項: //"[04:07.94]敗給你的黑色幽默" //"[02:07.79]敗給你的黑色幽默" }
這樣所列出來的歌詞時間順序是亂的,所以先進行一下排序: originLyricsBreak.sort(); 接下來就對每行歌詞進行時間和歌詞內(nèi)容的提取操作:定義一個數(shù)組LYRICSTEXT存放歌詞內(nèi)容,定義一個數(shù)組TIMESTRING存放時間。
for (var i = originLyricsBreak.length-1; i>=0; i--) { var tempText = originLyricsBreak[i].split("]")[1]; // 在時間標記"]"的位置,把每行拆分為長度為2的數(shù)組.數(shù)組第一項為時間"[02:07.79",第二項為歌詞內(nèi)容"敗給你的黑色幽默",在這里取第二項:歌詞內(nèi)容 lyricsText.unshift(tempText);//往LYRICSTEXT添加歌詞內(nèi)容項 var tempTimeString = originLyricsBreak[i].split("]")[0].slice(1);//取上述數(shù)組的時間信息"02:07.79",SLICE(1)把"["去掉, timeString.unshift(tempTimeString);//并添加到時間數(shù)組. timeValue.unshift(convertToTime(tempTimeString));//因為在TIMESTRING中,它是分:秒.毫秒的形式,不能直接運算,所以要轉(zhuǎn)換為數(shù)字的形式.convertToTime是自定義函數(shù),在下面將會介紹. } 在LOADLYRICS函數(shù)外定義convertToTime函數(shù): function convertToTime(str) { var times = str.split(":");//如果STR為02:07.79,TIMES數(shù)組則有兩項:"02"和"07.79" return parseInt(times[0])*60+parseFloat(times[1]);//結(jié)果等于2*60+7.79=127.79 }
至此,LRC的分析已經(jīng)完成,下一步就是要讓歌詞同步地顯示出來。
出處:藍色理想
責任編輯:moby
上一頁 FLASH打造LRC歌詞播放器 [1] 下一頁 FLASH打造LRC歌詞播放器 [3]
◎進入論壇Flash專欄版塊參加討論
|