audio标签用于播放音频文件,很不幸,歌词文件并没有相应接口
addTextTrack() 向音频添加新的文本轨道。//各大浏览器都没有支持
有两种方法可以实现歌词同步:
1. 使用setInterval();
2. 监听timeupdate
两种方法,个人觉得都不是很完美,暂时找不到更好的方法

function media(dom,src){this.dom = dom;this.src = src;this.audio = this.dom.getElementsByTagName('audio')[0];this.control = $(this.dom).find(".control")[0];this.lyrbox = $(this.dom).find(".lyrics")[0];this.timer = this.dom.getElementsByTagName('span')[0];this.timepoint = $(this.dom).find(".time-point")[0];this.timebardiv = $(this.dom).find('.time-bar div')[0];this.formatlyr = [];this.intval = null;this.init();formattime = function(t){var min = parseInt(t/60);var ss = parseInt(t)%60 ;ss = ss>9?ss:"0"+ss;return min+":"+ss;}
}
media.prototype.init = function() {var self = this;self.dom.style["background"] = "url("+self.src.img+") no-repeat";self.dom.style["background-size"] = "100% 100%";self.audio.src = self.src.mp3;self.audio.autoplay = true;self.lyr();self.audio.addEventListener("canplay",function(){self.timer.innerHTML = formattime(0)+ "/"+ formattime(self.audio.duration) ;self.control.style.display="block";// self.control.style["transition"]="all 4s;"// self.audio.autoplay = true;self.audio.play();if(self.intval) self.intval = null;self.intval = setInterval(function(){var len = self.formatlyr.length;var _c = self.audio.currentTime;var p =$(self.lyrbox).find('p')for(var i=0;i<p.length;i++){if(p[i].style['color'] != ''){p[i].style['color'] = '';break;}}for(var i=0;i<len;i++){var _t = i?self.formatlyr[i-1][0]:0;var _t1 =i<len-1? self.formatlyr[i+1][0] :9999;if(_c >= _t && _c < _t1){self.lyrbox.getElementsByTagName('p')[i].style['color'] = "#1D94E1";$(self.lyrbox).css("transform","translateY(-"+(i?i-1:0)*32+"px)").css("transition-duration","0.5s");break;}}var a=_c/self.audio.duration * (self.timebardiv.clientWidth - self.timepoint.clientWidth) ;$(self.timepoint).css("transform","translateX("+parseInt(a) +"px)");self.timer.innerHTML = formattime(self.audio.currentTime)+ "/"+ formattime(self.audio.duration) ;},1000) ;});self.ctrltime();self.togglepause();self.audio.canplay = function(){alert('canplay');}};media.prototype.togglepause = function() {var self = this;$(".ctrl-pause ").on('click',function(){$this = $(this).find('a');if($this.hasClass("play")){$this.addClass("pause");$this.removeClass("play");self.audio.pause();}else if($this.hasClass("pause")){$this.removeClass("pause");$this.addClass("play");self.audio.play();}else{}});
};media.prototype.lyr = function() {var self = this;function parselyr(d){var lines = d.split("\n"),pattern=/\[\d{2}:\d{2}.\d{2}\]/g,_l=[];var fg = document.createDocumentFragment();lines.forEach(function(i){if(i.match(pattern)){_l.push(i);}});_l.forEach(function(i,index){var s1 = i.split(']'),s2 = s1[0].slice(1),s3 = s2.split(':');var second  = parseInt(s3[0])*60 + parseFloat(s3[1]);var p = document.createElement('p');p.innerHTML = s1[1];fg.appendChild(p);self.formatlyr.push([second,s1[1]]);});self.lyrbox.appendChild(fg);}$.get(this.src.lyrics,function(data){parselyr(data);});
};media.prototype.ctrltime = function() {// body...var self =this;self.timebardiv.addEventListener('click',function(e){var dx = e.pageX - this.offsetLeft;var ct= parseInt(self.audio.duration*dx/this.clientWidth);self.audio.currentTime = ct;},false);};$(document).ready(function(){var m = new media(document.getElementById('playerbox'),sources[0]);
});

只在firefox chorme&& android测试
注意理解canplay事件,这个事件可能会多次触发。例如当你设置currentTime的时候,
也会触发canplay事件,这个不好解释 :(
第二种方法也差不多。

html5 audio实现歌词同步相关推荐

  1. 论HTML5 Audio 标签歌词同步的实现

    HTML5草案里面其实有原生的字幕标签(<track> Tag)的,但使用的是vtt格式的文件,非常规的字幕(.sub, .srt)或歌词文件(.lrc). 用法如下(代码来自W3Scho ...

  2. html5音乐和歌词同步,HTML5实现歌词同步

    开篇 HTML5的最强大之处莫过于对媒体文件的处理,如利用一个简单的vedio标签就可以实现视频播放.类似地,在HTML5中也有对应的处理音频文件的标签,那就是audio标签. audio标签 实现一 ...

  3. HTML5实践之歌词同步播放器

    歌曲播放我们会发现他的兼容性不是很好,譬如IE上能播放的flash播放器,再firfox或者chrome上就不是很好的应用了,因为有插件的阻碍!HTML5的出现让这一切成为了可能,但是播放器虽然播放了 ...

  4. php 歌词同步,HTML5实践之歌词同步播放器的示例代码分享

    歌曲播放我们会发现他的兼容性不是很好,譬如IE上能播放的flash播放器,再firfox或者chrome上就不是很好的应用了,因为有插件的阻碍!HTML5的出现让这一切成为了可能,但是播放器虽然播放了 ...

  5. audio实现歌词同步

    网上已经可以找到和歌词同步的不少方法,但是刚刚接触H5的小白,也想写上一些自己歌词同步时一些想法.我由于只考虑前端,所以就没有涉及服务器的问题了,浏览器本身请求本地文件比较严格,会出现如下错误 所以你 ...

  6. php中文歌词,详细介绍HTML5使用Audio标签实现歌词同步的效果

    HTML5的最强大之处莫过于对媒体文件的处理,如利用一个简单的vedio标签就可以实现视频播放.类似地,在HTML5中也有对应的处理音频文件的标签,那就是audio标签.通过本文给大家介绍HTML5使 ...

  7. HTML5使用Audio标签实现歌词同步的效果

    HTML5的最强大之处莫过于对媒体文件的处理,如利用一个简单的vedio标签就可以实现视频播放.类似地,在HTML5中也有对应的处理音频文件的标签,那就是audio标签  HTML5出来这么久了,但是 ...

  8. html简单歌词同步教程,HTML5实现歌词同步(示例代码)

    开篇 HTML5的最强大之处莫过于对媒体文件的处理,如利用一个简单的vedio标签就能够实现视频播放.相似地,在HTML5中也有相应的处理音频文件的标签,那就是audio标签 audio标签 实现一个 ...

  9. android 歌词同步 换行,HTML5音乐播放器同步显示歌词

    歌词文件的格式 实现之前,当然得了解一下歌词文件的格式了.常规歌词文件的格式基本是一句一行,每行由两部分组成,前面是中括号括起来的时间轴,后面紧跟歌词,像下面这样:[ti:记兰生襄铃] [ar:HIT ...

最新文章

  1. DELAY INIT 延迟初始化
  2. 解决关闭hdfs yarn spark hbase时no namenode to stop异常 no master to stop
  3. web页面--前端明水印
  4. 体验 Orbeon form PE 版本提供的 JavaScript Embedding API
  5. C#学习笔记——25个经典问题
  6. springboot 日志级别_SpringBoot实战(十三):Admin动态修改日志级别
  7. Apache Flink 不止于计算,数仓架构或兴起新一轮变革
  8. listview去掉底部多出的边框黑色
  9. 64位java虚拟机_java虚拟机64位下载
  10. GridView的DataFormatString格式化字符串
  11. UG与PM数控编程的区别在哪
  12. 接收机抽取的Matlab仿真代码,接收机的MATLAB仿真程序代码
  13. hive mapreduce reducer 调优
  14. 微信朋友圈附近推效果怎么样?
  15. 我和谁的天长地久(二)
  16. 视觉SLAM十四讲CH10代码解析及课后习题详解
  17. Windows系统解决谷歌翻译不能用的问题
  18. 在 Mac系统中,怎么能够连续的看图片
  19. Jquery入门指南教程
  20. navcat导入mysql bak_navcat excel数据导入mysql的方法

热门文章

  1. 高数-导数-反函数的导数
  2. 用全域安全防范美国NSA对西工大的网络攻击
  3. OkHttp完美封装,一行搞完外部请求
  4. 让小孩学Python语言编程有意义吗?
  5. Android L系统 剖析安卓5.0安卓L新特性
  6. 3D打印和cnc 2
  7. 【TypeScript入门】TypeScript入门篇——模块
  8. 论文python爬虫_论的解释|论的意思|汉典“论”字的基本解释
  9. 所有的华为手机都能用鸿蒙系统吗,华为完全开放鸿蒙,未来所有手机都能用鸿蒙系统?...
  10. python回归算法_基于Python的函数回归算法验证