歌詞解析總結


前言

 

  目前常用歌詞文件有3種

  • LRC
  • QRC
  • KRC

其中LRC是最常用的歌詞文件,千千靜聽、酷我音樂都是用LRC做歌詞解析的.它的格式非常簡單.解析容易但是,歌詞的精度只能控制到一行.

QRC是QQ音樂的歌詞文件.其精度可以控制到每個字.它是無加密的.

KRC是酷狗播放器專用歌詞文件,它通過了壓縮處理並且加密.它也能精確控制到每一個字,同時還綁定了歌曲的信息,酷狗播放器打開時能夠自動下載歌曲

 

LRC歌詞解析

 

開頭的歌曲信息可能會有2種展現形式

[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可能不會支持這種標簽)。

第一種比較簡單,和正文歌詞解析相同.第二種需要寫額外的正則解析.

其中時間標簽,形式為“[mm:ss]”或“[mm:ss.ff]”(分鍾數:秒數.毫秒數),時間標簽需位於某行歌詞中的句首部分,一行歌詞可以包含多個時間標簽(比如歌詞中的迭句部分)。當歌曲播放到達某一時間點時,MP3就會尋找對應的時間標簽並顯示標簽后面的歌詞文本,這樣就完成了“歌詞同步”的功能。

開頭標識信息正則

_regAr = /\[ar:(.+)\]/, 
_regTi = /\[ti:(.+)\]/,
_regAl = /\[al:(.+)\]/,
_regBy = /\[by:(.+)\]/,
_regOffset = /\[offset:.+\]/,
_regTime = /\[\d+:\d+(\.\d+)?\]/g,
    

 

解析歌詞

 

偽代碼:

  1. 將歌詞轉換為以行為單位的數組
  2. 對每一行做正則匹配,包括頭信息和時間戳的匹配 
  3. 拿到匹配后的數據封裝為想要的歌詞數據結構,如果要同步歌詞的話,最好封裝為js對象,{時間 : 歌詞} ,便與查找
    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;
    };

 

拖拽定位歌詞

 

偽代碼:

  1. 得到歌詞數據對象{時間 : 歌詞} 
  2. 對於一個給定的時間m,尋找小於m並且離m最近的時間
        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-analysis

 

 

參考資料:

 

歌詞解析

http://www.brafox.com/post/2015/HTML5/js解析lrc歌詞-制作滾動歌詞.html

酷狗QRC文件解析-java

酷狗QRC文件解析-php


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM