http://blog.csdn.net/wk313753744/article/details/38758317

1、该插件是一个jquery的编写的跟jplayer实现歌词同步的插件,最终效果如图:

2、首先引入jplayer的相关的js库和样式文件。

  1. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  2. <link href="skin/pink.flag/jplayer.pink.flag.css" rel="stylesheet" type="text/css" />
  3. <script type="text/javascript" src="js/jquery-1.8.2.min.js"></script>
  4. <script type="text/javascript" src="js/jquery.jplayer.min.js"></script>
  5. <script type="text/javascript" src="js/jquery.jplayer.lyric.js"></script>

3、把我修改的jquery的js文件贴出来,以备以后不能下载的朋友参考实现:

  1. /*****
  2. *原作mp3player.duapp.com
  3. *修改 :王坤
  4. *QQ群:151013733
  5. *修改内容说明:在原有基础上,需要使用start方法才能加载歌词,改进之后,在加载jplayer之前调用,显示歌词
  6. */
  7. (function($){
  8. $.lrc = {
  9. handle: null, /* 定时执行句柄 */
  10. list: [], /* lrc歌词及时间轴数组 */
  11. regex: /^[^
    ]∗((?:\s∗\[\d+\d+(?:\.\d+)?

    )+)([\s\S]*)$/, /* 提取歌词内容行 */

  12. regex_time: /
    (\d+)((?:\d+)(?:\.\d+)?)

    /g, /* 提取歌词时间轴 */

  13. regex_trim: /^\s+|\s+$/, /* 过滤两边空格 */
  14. callback: null, /* 定时获取歌曲执行时间回调函数 */
  15. interval: 0.3, /* 定时刷新时间,单位:秒 */
  16. format: '<li>{html}</li>', /* 模板 */
  17. prefixid: 'lrc', /* 容器ID */
  18. hoverClass: 'hover', /* 选中节点的className */
  19. hoverTop: 100, /* 当前歌词距离父节点的高度 */
  20. duration: 0, /* 歌曲回调函数设置的进度时间 */
  21. __duration: -1, /* 当前歌曲进度时间 */
  22. hasLrc:0,/**记录是否有歌词标记**/
  23. //初始化歌词
  24. init: function(txt){
  25. if(typeof(txt) != 'string' || txt.length < 1) return;
  26. /* 停止前面执行的歌曲 */
  27. this.stop();
  28. var item = null, item_time = null, html = '';
  29. /* 分析歌词的时间轴和内容 */
  30. //先按行拆分歌词
  31. txt = txt.split("\n");
  32. //对拆分的每行进行提取时间和歌词内容
  33. for(var i = 0; i < txt.length; i++) {
  34. //获取一行并去掉两端的空格 [00:11.38]如果你眼神能够为我片刻的降临
  35. item = txt[i].replace(this.regex_trim, '');
  36. //然后取出歌词信息
  37. if(item.length < 1 || !(item = this.regex.exec(item))) continue;
  38. while(item_time = this.regex_time.exec(item[1])) {
  39. this.list.push([parseFloat(item_time[1])*60+parseFloat(item_time[2]), item[2]]);
  40. }
  41. this.regex_time.lastIndex = 0;
  42. }
  43. /* 有效歌词 */
  44. if(this.list.length > 0) {
  45. this.hasLrc =1;
  46. /* 对时间轴排序 */
  47. this.list.sort(function(a,b){ return a[0]-b[0]; });
  48. if(this.list[0][0] >= 0.1) this.list.unshift([this.list[0][0]-0.1, '']);
  49. this.list.push([this.list[this.list.length-1][0]+1, '']);
  50. for(var i = 0; i < this.list.length; i++)
  51. html += this.format.replace(/\{html\}/gi, this.list[i][1]);
  52. /* 赋值到指定容器 */
  53. $('#'+this.prefixid+'_list').html(html).animate({ marginTop: 0 }, 100).show();
  54. /* 隐藏没有歌词的层 */
  55. $('#'+this.prefixid+'_nofound').hide();
  56. /* 定时调用回调函数,监听歌曲进度 */
  57. //this.handle = setInterval('$.lrc.jump($.lrc.callback());', this.interval*1000);
  58. }else{ /* 没有歌词 */
  59. this.hasLrc =0;
  60. $('#'+this.prefixid+'_list').hide();
  61. $('#'+this.prefixid+'_nofound').show();
  62. }
  63. },
  64. /* 歌词开始自动匹配 跟时间轴对应 */
  65. /**callback时间 jplayer的当前播放时间**/
  66. start: function(callback) {
  67. this.callback = callback;
  68. /* 有歌词则跳转到歌词时间轴 */
  69. if(this.hasLrc == 1) {
  70. this.handle = setInterval('$.lrc.jump($.lrc.callback());', this.interval*1000);
  71. }
  72. },
  73. /* 跳到指定时间的歌词 */
  74. jump: function(duration) {
  75. if(typeof(this.handle) != 'number' || typeof(duration) != 'number' || !$.isArray(this.list) || this.list.length < 1) return this.stop();
  76. if(duration < 0) duration = 0;
  77. if(this.__duration == duration) return;
  78. duration += 0.2;
  79. this.__duration = duration;
  80. duration += this.interval;
  81. var left = 0, right = this.list.length-1, last = right
  82. pivot = Math.floor(right/2),
  83. tmpobj = null, tmp = 0, thisobj = this;
  84. /* 二分查找 */
  85. while(left <= pivot && pivot <= right) {
  86. if(this.list[pivot][0] <= duration && (pivot == right || duration < this.list[pivot+1][0])) {
  87. //if(pivot == right) this.stop();
  88. break;
  89. }else if( this.list[pivot][0] > duration ) { /* left */
  90. right = pivot;
  91. }else{ /* right */
  92. left = pivot;
  93. }
  94. tmp = left + Math.floor((right - left)/2);
  95. if(tmp == pivot) break;
  96. pivot = tmp;
  97. }
  98. if(pivot == this.pivot) return;
  99. this.pivot = pivot;
  100. tmpobj = $('#'+this.prefixid+'_list').children().removeClass(this.hoverClass).eq(pivot).addClass(thisobj.hoverClass);
  101. tmp = tmpobj.next().offset().top-tmpobj.parent().offset().top - this.hoverTop;
  102. tmp = tmp > 0 ? tmp * -1 : 0;
  103. this.animata(tmpobj.parent()[0]).animate({marginTop: tmp + 'px'}, this.interval*1000);
  104. },
  105. /* 停止执行歌曲 */
  106. stop: function() {
  107. if(typeof(this.handle) == 'number') clearInterval(this.handle);
  108. this.handle = this.callback = null;
  109. this.__duration = -1;
  110. this.regex_time.lastIndex = 0;
  111. this.list = [];
  112. },
  113. animata: function(elem) {
  114. var f = j = 0, callback, _this={},
  115. tween = function(t,b,c,d){ return -c*(t/=d)*(t-2) + b; }
  116. _this.execution = function(key, val, t) {
  117. var s = (new Date()).getTime(), d = t || 500,
  118. b = parseInt(elem.style[key]) || 0,
  119. c = val-b;
  120. (function(){
  121. var t = (new Date()).getTime() - s;
  122. if(t>d){
  123. t=d;
  124. elem.style[key] = tween(t,b,c,d) + 'px';
  125. ++f == j && callback && callback.apply(elem);
  126. return true;
  127. }
  128. elem.style[key] = tween(t,b,c,d)+'px';
  129. setTimeout(arguments.callee, 10);
  130. })();
  131. }
  132. _this.animate = function(sty, t, fn){
  133. callback = fn;
  134. for(var i in sty){
  135. j++;
  136. _this.execution(i,parseInt(sty[i]),t);
  137. }
  138. }
  139. return _this;
  140. }
  141. };
  142. })(jQuery);

4、在jplayer初始化中使用如下:

  1. $(document).ready(function(){
  2. $("#jquery_jplayer_1").jPlayer({
  3. ready: function () {
  4. //初始化歌词信息(传入歌词文件文本)
  5. $.lrc.init($('#lrc_content').val());
  6. $(this).jPlayer("setMedia", {
  7. title: "Bubble",
  8. mp3: "mp3/林俊杰 - 曹操.mp3"
  9. }).jPlayer("play");
  10. },
  11. timeupdate: function(event) {
  12. if(event.jPlayer.status.currentTime==0){
  13. time = "";
  14. }else {
  15. time = event.jPlayer.status.currentTime;
  16. }
  17. },
  18. play: function(event) {
  19. //点击开始方法调用lrc.start歌词方法 返回时间time
  20. if($('#lrc_content').val()!==""){
  21. $.lrc.start(function(){
  22. return time;
  23. });
  24. }else{
  25. $(".content").html("没有字幕");
  26. }
  27. },
  28. swfPath: "js",
  29. supplied: "mp3",
  30. wmode: "window",
  31. smoothPlayBar: true,
  32. keyEnabled: true,
  33. remainingDuration: true,
  34. toggleDuration: true
  35. });
  36. });

5、这一步不是必要的 只是提供一个我的源码给你们参考:

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <title>QQ群:845885222 完整jplayer歌词同步demo</title>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <link href="skin/pink.flag/jplayer.pink.flag.css" rel="stylesheet" type="text/css" />
  7. <script type="text/javascript" src="js/jquery-1.8.2.min.js"></script>
  8. <script type="text/javascript" src="js/jquery.jplayer.min.js"></script>
  9. <script type="text/javascript" src="js/jquery.jplayer.lyric.js"></script>
  10. <style type="text/css">
  11. *{ margin:0; padding:0; }
  12. ul, ol, dl { list-style:none; }
  13. .content li.hover{color:red; }
  14. .content{ width:200px;overflow:hidden;padding:10px; text-align: center; font-size:12px;}
  15. </style>
  16. <script type="text/javascript">
  17. //<![CDATA[
  18. $(document).ready(function(){
  19. $("#jquery_jplayer_1").jPlayer({
  20. ready: function () {
  21. //初始化歌词信息(传入歌词文件文本)
  22. $.lrc.init($('#lrc_content').val());
  23. $(this).jPlayer("setMedia", {
  24. title: "Bubble",
  25. mp3: "mp3/林俊杰 - 曹操.mp3"
  26. }).jPlayer("play");
  27. },
  28. timeupdate: function(event) {
  29. if(event.jPlayer.status.currentTime==0){
  30. time = "";
  31. }else {
  32. time = event.jPlayer.status.currentTime;
  33. }
  34. },
  35. play: function(event) {
  36. //点击开始方法调用lrc.start歌词方法 返回时间time
  37. if($('#lrc_content').val()!==""){
  38. $.lrc.start(function(){
  39. return time;
  40. });
  41. }else{
  42. $(".content").html("没有字幕");
  43. }
  44. },
  45. swfPath: "js",
  46. supplied: "mp3",
  47. wmode: "window",
  48. smoothPlayBar: true,
  49. keyEnabled: true,
  50. remainingDuration: true,
  51. toggleDuration: true
  52. });
  53. });
  54. //]]>
  55. </script>
  56. </head>
  57. <body>
  58. <!--textarea只是用来存储歌词信息 并不做显示,如果要修改显示样式,修改id="lrc_list"的样式就行-->
  59. <textarea id="lrc_content" style="display:none;">
  60. [ti:曹操]
  61. [ar:林俊杰]
  62. [al:曹操]
  63. [00:00.03]林俊杰-《曹操》
  64. [00:13.35]作词:林秋离
  65. [00:20.12]作曲:林俊杰
  66. [00:25.32]
  67. [01:33.46][00:26.82]不是英雄 不读三国
  68. [01:40.12][00:33.43]若是英雄 怎么能不懂寂寞
  69. [02:39.68][01:46.34][00:39.63]独自走下长坂坡 月光太温柔
  70. [02:43.20][01:49.82][00:43.15]曹操不啰嗦 一心要那荆州
  71. [02:46.75][01:53.48][00:46.83]用阴谋 阳谋 明说 暗夺的摸
  72. [02:53.44][02:00.10][00:53.50]东汉末年分三国
  73. [02:56.37][02:03.15][00:56.52]烽火连天不休
  74. [03:00.12][02:06.75][01:00.17]儿女情长 被乱世左右
  75. [03:05.04][02:11.71][01:05.12]谁来煮酒
  76. [03:06.78][02:13.45][01:06.84]尔虞我诈是三国
  77. [03:09.85][02:16.43][01:09.73]说不清对与错
  78. [03:13.38][02:20.11][01:13.48]纷纷扰扰 千百年以後
  79. [03:18.44][02:25.06][01:18.45]一切又从头
  80. [03:25.99][02:30.17][01:26.81]喔……
  81. [88:88:88]
  82. </textarea>
  83. <div id="jquery_jplayer_1" class="jp-jplayer"></div>
  84. <div id="jp_container_1" class="jp-audio">
  85. <div class="jp-type-single">
  86. <div class="jp-gui jp-interface">
  87. <ul class="jp-controls">
  88. <li><a href="javascript:;" class="jp-play" tabindex="1">play</a></li>
  89. <li><a href="javascript:;" class="jp-pause" tabindex="1">pause</a></li>
  90. <li><a href="javascript:;" class="jp-stop" tabindex="1">stop</a></li>
  91. <li><a href="javascript:;" class="jp-mute" tabindex="1" title="mute">mute</a></li>
  92. <li><a href="javascript:;" class="jp-unmute" tabindex="1" title="unmute">unmute</a></li>
  93. <li><a href="javascript:;" class="jp-volume-max" tabindex="1" title="max volume">max volume</a></li>
  94. </ul>
  95. <div class="jp-progress">
  96. <div class="jp-seek-bar">
  97. <div class="jp-play-bar"></div>
  98. </div>
  99. </div>
  100. <div class="jp-volume-bar">
  101. <div class="jp-volume-bar-value"></div>
  102. </div>
  103. <div class="jp-current-time"></div>
  104. <div class="jp-duration"></div>
  105. <ul class="jp-toggles">
  106. <li><a href="javascript:;" class="jp-repeat" tabindex="1" title="repeat">repeat</a></li>
  107. <li><a href="javascript:;" class="jp-repeat-off" tabindex="1" title="repeat off">repeat off</a></li>
  108. </ul>
  109. </div>
  110. <div class="jp-details">
  111. <ul>
  112. <li><span class="jp-title"></span></li>
  113. </ul>
  114. </div>
  115. <div class="jp-no-solution">
  116. <span>Update Required</span>
  117. To play the media you will need to either update your browser to a recent version or update your <a href="http://get.adobe.com/flashplayer/" target="_blank">Flash plugin</a>.
  118. </div>
  119. </div>
  120. </div>
  121. <div class="content">
  122. <ul id="lrc_list">
  123. 加载歌词……
  124. </ul>
  125. </div>
  126. </body>
  127. </html>

6、最后还是要提供下载地址:

微云下载歌词同步插件  (密码:LSm1)

csdn 下载:http://download.csdn.net/detail/wk313753744/7803013

Jplayer歌词同步显示插件的更多相关文章

  1. TextView实现歌词同步

    利用TextView实现歌词同步显示,这是一个简单的利用TextView实现滚动实时显示歌词的. 里面的内容都已经写上了详细的注释.里面播放音乐的时候歌词同步展示. 做媒体这块的朋友可以学习一下,练练 ...

  2. ANDROID_MARS学习笔记_S01原始版_023_MP3PLAYER004_同步显示歌词

    一.流程分析 1.点击播放按钮,会根据lrc名调用LrcProcessor的process()分析歌词文件,得到时间队列和歌词队列 2.new一个hander,把时间队列和歌词队列传给自定义的线程类U ...

  3. 基于jplayer实现歌词同步的JS音乐播放器效果

    分享一款基于jplayer实现歌词同步的JS音乐播放器效果.这是一款基于jQuery实现的音乐播放器功能代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <textare ...

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

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

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

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

  6. Android VLC播放器二次开发3——音乐播放(歌曲列表+歌词同步滚动)

    今天讲一下对VLC播放器音频播放功能进行二次开发,讲解如何改造音乐播放相关功能.最近一直在忙着优化视频解码部分代码,因为我的视频播放器需要在一台主频比较低的机器上跑(800M主频),所以视频解码能力受 ...

  7. AS3 歌词同步

    这里实例素材: 我们不一样.lrc 我们不一样.mp3 歌词同步其实就是靠lrc文本文件,打开它,可以看到时间点和对应的歌词. 打开lrc内容如下: [ti:我们不一样][ar:大壮][al:][by ...

  8. HTML5实现歌词同步

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

  9. 用HTML5的Audio标签做一个歌词同步的效果

    HTML5出来这么久了,但是关于它里面的audio标签也就用过那么一次,当然还仅仅只是把这个标签插入到了页面中.这次呢就刚好趁着帮朋友做几个页面,拿这个audio标签来练练手. 首先你需要向页面中插入 ...

随机推荐

  1. MFC webbrowser读取文档的meta分析

    IDispatch* pDisp = NULL; IDispatch* pDisp2 = NULL; IHTMLDocument2 *pHtmlDoc2 = NULL; IHTMLElementCol ...

  2. Distributed Transaction Coordinator 无法启动

    有时候我们需要进行COM应用程序的权限设置,控制面板-->管理工具-->组件服务-->然后依此展开:组件服务-->计算机-->我的电脑-->DCOM 配置,接下来找 ...

  3. Jmeter组件2. Timer 定时器

    关于定时器,首先明确几个概念 定时器在每个Sampler执行之前执行 定时器有作用域,同一个作用域内的定时器会在域内Sampler执行之前都执行掉 如果要让某定时器只作用于一个Sampler,将定时器 ...

  4. 洛谷P3374 【模板】树状数组 1

    P3374 [模板]树状数组 1 140通过 232提交 题目提供者HansBug 标签 难度普及/提高- 提交  讨论  题解 最新讨论 题目描述有误 题目描述 如题,已知一个数列,你需要进行下面两 ...

  5. 【Linux】依赖包检查

    参考:http://www.cnblogs.com/zc22/p/3197038.html ldd xx.so

  6. 15 个有用的 MySQL/MariaDB 性能调整和优化技巧(转载的一篇好文)

    MySQL 是一个强大的开源关系数据库管理系统(简称 RDBMS).它发布于 1995 年(20年前).它采用结构化查询语言(SQL),这可能是数据库内容管理中最流行的选择.最新的 MySQL 版本是 ...

  7. uniDBGrid导入数据库(转红鱼儿)

    有朋友问如何将excel导入数据库,这是我做的uniGUI项目中代码,实现uniDBGrid导入数据库的函数,因为用了kbmMW,所以你看到是将uniDBGrid导入kbmMWClientQuery, ...

  8. DataTable.Compute()用法

    DataTable.Compute()用法 2010-04-07 11:28 一.DataTable.Compute()方法說明如下 作用:          计算用来传递筛选条件的当前行上的给定表达 ...

  9. c++学习笔记——构造函数

    构造函数定义:每个类都分别定义了它的对象被初始化的方式,类通过一个或几个特殊的成员函数来控制其对象的初始化过程,这些函数叫做构造函数. 需要注意的几点: 1:构造函数不能被声明为const的,当我们创 ...

  10. SQL常用代码收集

    1.存储过程中,使用in查询时的参数处理方式 使用情形描述:传入存储过程的参数为一个字符串@IDs,以固定分隔符连接 新建字符串分割函数,然后将分割结果传入存储过程: CREATE FUNCTION ...