歌词解析总结
2016-03-06 15:17
344 查看
前言
目前常用歌词文件有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,
解析歌词
伪代码:将歌词转换为以行为单位的数组
对每一行做正则匹配,包括头信息和时间戳的匹配
拿到匹配后的数据封装为想要的歌词数据结构,如果要同步歌词的话,最好封装为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; };
拖拽定位歌词
伪代码:得到歌词数据对象{时间 : 歌词}
对于一个给定的时间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
相关文章推荐
- 不重启修改计算机名
- 搭建本地yum源
- MyCat - 测试篇
- MyCat - 测试篇
- MyCat - 测试篇
- explicit关键字的使用
- 【慕课笔记】2-1 File类常用API介绍
- android studio 开发 proxy 异常
- 第一周学习进度条
- android中使用codec总是报NoSuchMethodError的问题根源
- 树的最小支配集,最小点覆盖与最大独立集
- 斐波那契数列
- 使用jQuery或者原生js实现鼠标滚动加载页面新数据
- linux(ubuntu)sudoers权限错误导致sudo无法使用
- Android 菜鸟认知总结——Android初印象之系统架构和app 组件
- hdoj 1418 抱歉(公式)
- openssl 加密
- Tsinsen-A1103 ====单循环赛制====固定轮转法。。
- 构建之法阅读笔记01
- 几个具体的编辑器类的成员