本例用于在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 国际」创作共享协议,转载或使用请遵守署名协议。查看源码: