• 歌词解析总结


    前言

      目前常用歌词文件有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

  • 相关阅读:
    IDEA连接 Oracle数据库
    什么是混合云备份
    什么是阿里云ACA认证
    什么是阿里云ACE认证
    什么是轻量应用服务器
    什么是时序时空数据库TSDB
    什么是数据管理DMS
    什么是分析型数据库PostgreSQL版
    阿里云多端小程序
    阿里云云计算ACP专业认证考试
  • 原文地址:https://www.cnblogs.com/fly-snow/p/5201646.html
Copyright © 2020-2023  润新知