本例用于在lrc控制模块,在用于在timeupdate时间中同步更新lrc使用。
这里首先放置一个歌词解析模块,下面还需要做一个filter做歌词时间格式化模块
/**
* 歌词解析模块
*
* 重复类歌词将repeat至array
* @author icepro
* @Time 2016-3-16 17:46:11
*/
function lrcParser(lrc){
// 正则表达式用于已匹配[00:00:00][00:00][00:00.00]
var reg = /(\[\d{2}[:]\d{2}([.|:]\d{2}){0,1}\])+(.*)[\n|\r|\r\n]/g;
var res = lrc.toString().match(reg);
// 用来push入歌词
var stack = new Array();
if(res.length>0){
$.each(res,function(i1,item1){
// 获取时间
var timeStmp = item1.toString().match(/\[\d{2}[:]\d{2}([.|:]\d{2}){0,1}\]/g);
// 获取歌词,将时间和换行符去除
var song = item1.toString().replace(/\[\d{2}[:]\d{2}([.|:]\d{2}){0,1}\]/g,"").replace(/[\n|\r|\r\n]/g,"");
$.each(timeStmp,function(i2,item2){
stack.push({"song":song,"time":item2});
});
});
}
// 依照时间排序
return stack.sort(function compare(a,b){return a.time.localeCompare(b.time);});
}
下面放置一个歌词控制器模块。
/**
* 歌词控制器
*
* 我认为在歌词控制中,不停循环遍历数组当然是可以的,不过这样显然太过浪费性能了
* 事实上我们只需要在重定位的时候遍历一遍数组获得新的index就好了,判断总比循环节省时间吧
* 以下方法麻烦了点,但是基于这个思路制作lrc控制器也是可以的
* 当然咯改成遍历肯定要灵活一些,个人习惯不同
* @author icepro
* @Time 2016-3-10 11:13:55
*/
function lrcControl(){
var lrcs = new Array(),
nowPlay = 0,
offset = 0,
speed = 0;
/* 其中offset偏移时间和动画速率speed还未列入需求 */
var ini = function(){
var lrcs = new Array(),
nowPlay = 0,
offset = 0,
speed = 0;
}
// 设置lrc,lrc格式必须为数组[{song:XXXX,time:[00:00.00]}]格式,判断也是
// 如此,所以传入前必须先通过一个解释器统一格式
var setLrc = function(lrc){
lrcs = lrc;
}
// 获得所有的lrc,输出的lrc是经过排序的
var getAllLrc = function(){
return lrcs;
}
// 判断是否需要播放下一节
var canPlayNext = function(nowtime){
nowtime = "["+nowtime+"]";
// console.log(nowtime+":"+lrcs[nowPlay].time);
if(nowtime.localeCompare(lrcs.length>nowPlay&&lrcs[nowPlay].time)>=0){
nowPlay += 1;
console.log(lrcs[nowPlay-1].song);
}else{
return false;
}
}
// 获得现在播放的index次序,在angular下不对数组后续操作重排的话直接可以使用$index即可替换class
var getThisPlay = function(){
return nowPlay;
}
// 重新计算lrc位置
var reCalculate = function(nowtime){
nowtime = "["+nowtime+"]";
$.each(lrcs,function(i,item){
if(nowtime.localeCompare(item.time)>=0)
return (nowPlay = (i-1<0?0:i-1));
});
}
return {
setLrc:setLrc,
reCalculate:reCalculate,
getThisPlay:getThisPlay,
getAllLrc:getAllLrc,
canPlayNext:canPlayNext,
}
}
本文标题:lrc控制器试验
永久链接:https://iceprosurface.com/2016/03/18/2016/2016-03-18-lrc-cont/
作者授权:本文由 icepro 原创编译并授权刊载发布。
版权声明:本文使用「署名-非商业性使用-相同方式共享 4.0 国际」创作共享协议,转载或使用请遵守署名协议。