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. SG函数模板(转)

    ps:sg[i]为0表示i节点先手必败. 首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数.例如mex{0,1,2,4}=3.me ...

  2. rpm包形式安装MySQL

    1.下载Mysql安装所需的rpm包 http://cdn.mysql.com/Downloads/MySQL-5.6/MySQL-server-5.6.21-1.linux_glibc2.5.x86 ...

  3. Windows 2008等操作系统升级时出现800F0818错误代码的解决方法

    今天我在网络中的一台Windows Server 2008 R2升级时,出现“代码800F0818”的错误提示,如图1-1所示.

  4. springMVC使用与生成序列号

    springMVC使用与生成序列号 我是以springMVC的方式提供序列号 代码可以直接在项目中用 第一步:controller类 @Autowired private PkGenerator pk ...

  5. Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

    今天碰到了一个查询异常问题,上网查了一下,感谢原创和译者 如果你使用的数据库连接类是 the Data Access Application Blocks "SqlHelper" ...

  6. phpstorm

    9XVKERIY9F-eyJsaWNlbnNlSWQiOiI5WFZLRVJJWTlGIiwibGljZW5zZWVOYW1lIjoiYXNoZXIgY2hlbiIsImFzc2lnbmVlTmFtZ ...

  7. bind的用处

    刚做的项目,遇到过这样的问题,就是在动态追加标签时,给追加的标签添加事件时,在标签内追加不了,后来使用了delegate代理,能响应了,但也是不能给动态追加的代理 $("body" ...

  8. rotate the clock

    A program test: You are given N round clocks. Every clock has M hands, and these hands can point to ...

  9. Origin9.1如何绘制风向玫瑰图(Binned Data)?

    Origin9.1如何绘制风向玫瑰图(Binned Data)? 时间:2014/5/14 21:02:44 点击: 2624 核心提示:今天为大家介绍下如何使用Origin9.1绘制如下图所示的风向 ...

  10. POJ 2502 - Subway Dijkstra堆优化试水

    做这道题的动机就是想练习一下堆的应用,顺便补一下好久没看的图论算法. Dijkstra算法概述 //从0出发的单源最短路 dis[][] = {INF} ReadMap(dis); for i = 0 ...