zoukankan      html  css  js  c++  java
  • 歌词解析总结

    前言

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

  • 相关阅读:
    Vue路由机制
    谷歌浏览器打不开应用商店的解决方法
    Vue报错——Component template should contain exactly one root element. If you are using vif on multiple elements, use velseif to chain them instead.
    Vue.js学习之——安装
    Vue使用axios无法读取data的解决办法
    关于localstorage存储JSON对象的问题
    2013年整体计划
    个人喜欢的警语收集
    Linux防火墙的关闭和开启
    Flex修改title 转载
  • 原文地址:https://www.cnblogs.com/fly-snow/p/5201646.html
Copyright © 2011-2022 走看看