·您当前的位置:首页 > 技术教程 > Html5技术 >

[html5]在html5下做音频Audio标签实现歌词同步效果的音乐播放器(2)

时间:2017-01-24 09:38酷播
通过上面的代码就可以LRC文件读取成文本,然后就可以进行下一步处理了。 提取分离 因为时间我歌词的分隔是很有规律的,先通过\n将所有文字分隔成一行行存入数组,然后根据文章开始分析的思路一步一步提取分离。为此

通过上面的代码就可以LRC文件读取成文本,然后就可以进行下一步处理了。

提取分离

因为时间我歌词的分隔是很有规律的,先通过\n将所有文字分隔成一行行存入数组,然后根据文章开始分析的思路一步一步提取分离。为此写一个解析歌词的函数。

  1. function parseLyric(text) { 
  2.     //将文本分隔成一行一行,存入数组 
  3.     var lines = text.split('\n'), 
  4.         //用于匹配时间的正则表达式,匹配的结果类似[xx:xx.xx] 
  5.         pattern = /\[\d{2}:\d{2}.\d{2}\]/g, 
  6.         //保存最终结果的数组 
  7.         result = []; 
  8.     //去掉不含时间的行 
  9.     while (!pattern.test(lines[0])) { 
  10.         lineslines = lines.slice(1); 
  11.     }; 
  12.     //上面用'\n'生成生成数组时,结果中最后一个为空元素,这里将去掉 
  13.     lines[lines.length - 1].length === 0 && lines.pop(); 
  14.     lines.forEach(function(v /*数组元素值*/ , i /*元素索引*/ , a /*数组本身*/ ) { 
  15.         //提取出时间[xx:xx.xx] 
  16.         var time = v.match(pattern), 
  17.             //提取歌词 
  18.             vvalue = v.replace(pattern, ''); 
  19.         //因为一行里面可能有多个时间,所以time有可能是[xx:xx.xx][xx:xx.xx][xx:xx.xx]的形式,需要进一步分隔 
  20.         time.forEach(function(v1, i1, a1) { 
  21.             //去掉时间里的中括号得到xx:xx.xx 
  22.             var t = v1.slice(1, -1).split(':'); 
  23.             //将结果压入最终数组 
  24.             result.push([parseInt(t[0], 10) * 60 + parseFloat(t[1]), value]); 
  25.         }); 
  26.     }); 
  27.     //最后将结果数组中的元素按时间大小排序,以便保存之后正常显示歌词 
  28.     result.sort(function(a, b) { 
  29.         return a[0] - b[0]; 
  30.     }); 
  31.     return result; 

这一步,我们便得到 了一个总的数组,它的元素是一些小的数组,这些小数组包含两个元素,一个是时间,并且这个时间已经由分:秒的形式转化为了秒,一个是时间对应的歌词[['秒数','歌词'], ['秒数','歌词']…]

歌词同步

接下来就是先把全部歌词显示到页面,进行滚动式显示,或者也可以不全部显示,像电影字幕一样,唱一句显示一句。

下面看如何同步。当歌曲播放时,监听audio标签ontimeupdate事件,即时更新显示歌词到页面即可。

  1. //获取页面上的audio标签 
  2. var audio = document.getElementsByTagName('audio'), 
  3.     //显示歌词的元素 
  4.     lyricContainer = document.getElementById('lyricContainer'); 
  5. //监听ontimeupdate事件 
  6. audio.ontimeupdate = function(e) { 
  7.     //遍历所有歌词,看哪句歌词的时间与当然时间吻合 
  8.     for (var i = 0l = lyric.length; i < l; i++) { 
  9.         if (this.currentTime /*当前播放的时间*/ > lyric[i][0]) { 
  10.             //显示到页面 
  11.             lyricContainer.textContent = that.lyric[i][1]; 
  12.         }; 
  13.     }; 
  14. }; 

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器