目前經常使用歌詞文件有3種php
其中LRC是最經常使用的歌詞文件,千千靜聽、酷我音樂都是用LRC作歌詞解析的.它的格式很是簡單.解析容易可是,歌詞的精度只能控制到一行.html
QRC是QQ音樂的歌詞文件.其精度能夠控制到每一個字.它是無加密的.java
KRC是酷狗播放器專用歌詞文件,它經過了壓縮處理而且加密.它也能精確控制到每個字,同時還綁定了歌曲的信息,酷狗播放器打開時可以自動下載歌曲git
開頭的歌曲信息可能會有2種展示形式github
[00:02.37]三十而立
[00:03.12]
[00:03.80]做詞:唐孝凡
[00:04.55]做曲:唐孝凡
[00:05.18]演唱:唐孝凡
[00:06.43]出品:深圳小龍文化
[ar:藝人名]
[ti:曲名]
[al:專輯名]
[by:編者(指編輯LRC歌詞的人)]
[offset:時間補償值] 其單位是毫秒,正值表示總體提早,負值相反。這是用於整體調整顯示快慢的,(但多數的MP3可能不會支持這種標籤)。
第一種比較簡單,和正文歌詞解析相同.第二種須要寫額外的正則解析.segmentfault
其中時間標籤,形式爲「[mm:ss]」或「[mm:ss.ff]」(分鐘數:秒數.毫秒數),時間標籤需位於某行歌詞中的句首部分,一行歌詞能夠包含多個時間標籤(好比歌詞中的迭句部分)。當歌曲播放到達某一時間點時,MP3就會尋找對應的時間標籤並顯示標籤後面的歌詞文本,這樣就完成了「歌詞同步」的功能。
數組
_regAr = /\[ar:(.+)\]/, _regTi = /\[ti:(.+)\]/, _regAl = /\[al:(.+)\]/, _regBy = /\[by:(.+)\]/, _regOffset = /\[offset:.+\]/, _regTime = /\[\d+:\d+(\.\d+)?\]/g,
僞代碼:數據結構
var _analysisLrc = function(){ var lrcObj = {}, lrcArray = this.lrcStr.split("\\n"); for(var i=0;i<lrcArray.length;i++){ var lyric = decodeURIComponent(lrcArray[i]); var timeReg = /\[\d*:\d*((\.|\:)\d*)*\]/g; var timeRegExpArr = lyric.match(timeReg); if(!timeRegExpArr)continue; //保存標準歌詞數組 var clause = lyric.replace(timeReg,''); this.lrcArray.push(clause); for(var k = 0,h = timeRegExpArr.length;k < h;k++) { var t = timeRegExpArr[k]; var min = Number(String(t.match(/\[\d*/i)).slice(1)), sec = Number(String(t.match(/\:\d*/i)).slice(1)); var time = min * 60 + sec; //保存解析後的歌詞信息對象 lrcObj[time] = { txt : clause, index : this.lrcArray.length - 1 } } } this.lrc = lrcObj; };
僞代碼:工具
findLrc : function(second){ //找到比當前時間小,且離得最近的時間 //由於歌詞都是在時間以後的 var min = 1000; for( var i in this.lrc){ if ( i < second && Math.abs(second - i) < Math.abs(second - min) ){ min = i; } } return this.lrc[min]["index"]; },
綜合上面的功能,我寫了個歌詞解析的小工具. 有興趣的能夠看下 https://github.com/Alan110/desire/tree/master/lrc-analysispost