用JS实现歌词与播放音乐同步

第一步:把歌词解析成JS对象

参看我的上一篇文章:用JS解析LRC格式的歌词
解析后的歌词写到页面的一个列表中,效果如下:

主要HTML代码:

<!-- 播放器 -->
<audio id="audio" src="media/沙漠骆驼 - 展展与罗罗.mp3" controls preload="auto"></audio>
<!-- 歌词 -->
<div class="lyric_area"><ul id="lyric"></ul>
</div>

CSS:

.lyric_area{/*歌词显示区域*/height: 300px; /*歌词区域高度*/overflow: hidden; /*隐藏超出部分*/margin-top: 15px;
}
#lyric{/*歌词列表*/line-height: 20px;/*行高,这个值要用在歌词滚动距离上*/transition-duration: 600ms;/*滚动速度*/}
#lyric .lineHigh{/*高亮行*/color: red;
}

第二步:播放音乐时让当前行高亮显示并向上滚动

解析后的歌词放在oLRC对象的ms数组中,呈现以下形态:
ms : [
{t: “0.590”, c: “沙漠骆驼 - 展展与罗罗”}
{t: “2.970”, c: “词:展展与罗罗”}
{t: “4.460”, c: “曲:展展与罗罗”}
{t: “26.450”, c: “我要穿越这片沙漠”}
{t: “28.510”, c: “找寻真的自我”}
{t: “30.500”, c: “身边只有一匹骆驼陪我”}
… …
]
ms[i].t是歌词的开始时间,ms[i].c是歌词内容。
现在歌词内容已经写在上面的<ul>列表中了,我们要做的是让高亮歌词与播放同步。

var lineNo: 0, //当前行
var C_pos: 6, //C位
var offset: -20, //滚动距离(应等于行高)
var audio = document.getElementById("audio");//播放器
var ul = document.getElementById("lyric"); //歌词容器列表//高亮显示歌词当前行及文字滚动控制,行号为lineNo
function lineHigh() {var lis = ul.getElementsByTagName("li");//歌词数组if(lineNo>0){lis[lineNo-1].removeAttribute("class");//去掉上一行的高亮样式}lis[lineNo].className = "lineHigh";//高亮显示当前行//文字滚动if(lineNo>C_pos){ul.style.transform = "translateY("+(lineNo-C_pos)*offset+"px)"; //整体向上滚动一行高度}
}//滚回到开头,用于播放结束时
function goback() {document.querySelector("#lyric .lineHigh").removeAttribute("class");ul.style.transform = "translateY(0)";lineNo = 0;
}//监听播放器的timeupdate事件,实现文字与音频播放同步
audio.ontimeupdate = function () {if(lineNo==oLRC.ms.length)return;var curTime = audio.currentTime; //播放器时间if(parseFloat(oLRC.ms[lineNo].t)<=curTime){lineHigh();//高亮当前行lineNo++;}
};//监听播放器的ended事件,播放结束时回滚歌词
audio.onended = function () {goback(); //回滚歌词
};

歌词与播放同步的关键是从播放器获取当前时间,这需要监听audio对象的timeupdate事件,该事件在播放位置发生变化时触发,再从audio对象的currentTime属性中可取到当前播放时间。
滚动歌词使用的是CSS的变换函数transform:translateY(长度),它可以把歌词容器整体上移指定长度,由于容器外的div标签设置了overflow: hidden;,所以感觉歌词在向上滚动了。

用JS实现歌词与播放音乐同步相关推荐

  1. python播放音乐同步歌词_使用Python下载歌词并嵌入歌曲文件中的实现代码

    使用python扫描本地音乐并下载歌词 这次这个真的是干货哦,昨晚弄了半晚上,,,,从8点吃完饭就开始写,一直到了快12点才弄好,,,新手,伤不起呀.... 先简单的说下吧,百度提供了一个音乐搜索的a ...

  2. python播放音乐同步歌词范晓萱_范晓萱同步的歌词

    你是不是在找范玮琪的这首同步的歌词?下面是学习啦!小编帮你整理了这首歌词的相关的资料希望对你有用! 同步的歌词 同步-(电影<陪安东尼度过漫长岁月>主题曲)-范晓萱 相隔两地的时空 默契对 ...

  3. python播放音乐同步歌词_python 根据歌词的时间(LRC文件),生成H5 audio按句播放器...

    1.效果图 2.Python代码: # coding=UTF-8 import codecs import os import re # 正则校验是否为浮点数字 def is_number(num): ...

  4. python播放音乐同步歌词_linux 下 python 调用 mplayer 解析歌词同步播放显示

    标签: 加载同目录同名歌词同步显示 #!/usr/bin/python # -*- coding: utf-8 -*- import sys, os, time, subprocess, re, ch ...

  5. python播放音乐同步歌词范晓萱_范晓萱《同步》歌词-同步Mp3歌词下载_爱歌词网...

    同步LRC歌词 [ti:同步] [ar:范晓萱] [al:] [by:agul369] [00:01.77]范晓萱 - 同步(陪安东尼度过漫长岁月电影主题曲) [00:10.00]歌词搜索www.22 ...

  6. python播放音乐同步歌词范晓萱_同步_范晓萱_高音质在线试听_同步歌词|歌曲下载_酷狗音乐...

    范晓萱 - 同步 专辑: 同步 歌手: 范晓萱 [id:$010126C0] [ar:范晓萱] [ti:同步] [by:] [hash:d71f1a9610608a9caf43609ffd37686 ...

  7. python播放音乐同步歌词_python终端播放音乐同定制步显示本地或网络歌词

    文章来源:淘论文网   发布者:毕业设计 浏览量: #!/usr/bin/python # -*- encoding:utf-8 -*- #============================== ...

  8. js倒计时结束后播放音乐html5,js实现简单的倒计时

    这篇文章主要为大家详细介绍了js实现简单的倒计时,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了js实现简单倒计时的具体代码,供大家参考,具体内容如 ...

  9. js倒计时结束后播放音乐html5,倒计时到HTML5视频结束(Countdown to the end of the HTML5 video)...

    倒计时到HTML5视频结束(Countdown to the end of the HTML5 video) 我可以倒数到HTML5视频的结尾吗? Video ends after XX second ...

最新文章

  1. ACM程序设计选修课——1030: Hungar的时尚球场(水题+耐心)
  2. 23. Leetcode 24. 两两交换链表中的节点 (链表-基础操作类-交换链表)
  3. 前端渲染与后端渲染的区别
  4. fancybox去除不受待见的水平滚动条
  5. 直方图绘制与直方图均衡化实现
  6. python 字符串格式化语法_Python基础语法--字符串格式化
  7. 如何在 Kubernetes Pod 内进行网络抓包
  8. 雪碧+滑动门,自适应宽度菜单
  9. 2022年高压电工操作证考试题库及在线模拟考试
  10. linux xshell 如何使用教程,Xshell入门教程
  11. C功底挑战Java菜鸟入门概念干货(三)
  12. 鸿鹄云商平台--技术框架
  13. java ecb加密_AES(Rijndael)算法ECB模式加密
  14. NLP入门(八)使用CRF++实现命名实体识别(NER)
  15. 经济的寒冬,数据的春天
  16. 一梦江湖——华山快还钱是怎么会事呢?
  17. 将dae格式文件导入RViz中创建环境
  18. New Era with AlphaGo
  19. 如何高效学习Python?Python入门 Python教程 Python学习路线
  20. ​美国UIUC信息学院汪浩瀚老师课题组招收全奖博士生及合作者

热门文章

  1. ListView添加动态悬浮header的另类方式
  2. 周易Java_基于JAVA的周易解梦接口调用代码实例
  3. Springboot 自定义mybatis 拦截器,实现我们要的扩展
  4. 论文解读:NSP-BERT: A Prompt-based Zero-Shot Learner Through an Original Pre-training Task——Next Sentence
  5. ElasticSearch还能性能调优,涨见识、涨见识了!!!
  6. mongodb数据库淘汰_Mongodb数据库学习
  7. 彼岸花的传说——附三色彼岸花图
  8. ArcGIS报错the database client software failed to load不能连接到oracle数据库,因为数据库客户端软件加载失败
  9. 杰理之MIC到usb【篇】
  10. nginx使用80端口