近期闲来无事,就想着复习一下前端的东西,然后正好跟朋友搞了一个公共开放的音乐api接口,就想着写一个音乐播放器玩玩!

话不多说,直接上图,然后上代码

【播放器显示正在播放】

实现功能:

1:歌词随着歌单滚动!

2:背景虚拟化,跟着歌曲封面图改变!

这个好多朋友问过我怎么做到的,这里可以共享出源码。

  歌词滚动很重要一点就是需要解析歌词,其实是我们自己想复杂了,先来看看api获取的歌词是什么样的:

  如下所示,获取歌词其实前面都带着时间,所以我们要做到的就是根据歌曲播放的时间来跟歌词前面的时间对比,然后定位到歌词

  那一行,然后通过js设置那一行歌词高亮,字体放大,改变字体颜色!

  [by:GoodTM]
  [00:00.00] 作曲 : 花粥
  [00:01.00] 作词 : 花粥
  [00:10.43]
  [00:11.12]在夜半三更过天桥从来不敢回头看
  [00:15.86]白日里是车水马龙此时脚下是忘川
  [00:21.30]我独自走过半山腰山间野狗来作伴
  [00:25.19]层林尽染百舸流秋风吹过鬼门关
  [00:29.81]一瞬三年五载 品粗茶 食淡饭
  [00:34.49]六界八荒四海 无人与我来叫板
  [00:39.19]人间荒唐古怪 竹林外 有书斋
  [00:43.78]匿于此地畅快 偏来者不善善者不来
    
所以获取到歌词之后需要js先解析歌词,循环获取!
话不多说直接上源码:

首先ajax请求获取歌词!    

   $.ajax({ //异步请求获取歌词

url:url,
type:"post",
success:function(data){

if(data == '暂无歌词') {
lyricTip('LH MUSIC、给你美好的音乐');
return false;
}

lyricText = parseLyric(data); // 解析获取到的歌词   调取下面解析方法

if(lyricText === '') {
lyricTip('LH MUSIC、给你美好的音乐');
return false;
}

lyricArea.html(''); // 清空歌词区域的内容
lyricArea.scrollTop(0); // 滚动到顶部

lastLyric = -1;

// 显示全部歌词
var i = 0;
for(var k in lyricText){
var txt = lyricText[k];
if(txt.indexOf('纯音乐') != -1){
lyricTip('LH MUSIC、给你美好的音乐');
return false;
}
if(!txt) txt = " ";
var li = $("<li data-no='"+i+"' class='lrc-item'>"+txt+"</li>");
lyricArea.append(li);
i++;
}
}      

});

// 解析歌词
  // 参数:原始歌词文件
  function parseLyric(lrc) {    //传入歌词,解析参数   lrc
    if(lrc === '') return '';  //判断非空
    var lyrics = lrc.split("\n");  //去除空格
    var lrcObj = {};
    for(var i=0;i<lyrics.length;i++){
    var lyric = decodeURIComponent(lyrics[i]);
    var timeReg = /\[\d*:\d*((\.|\:)\d*)*\]/g;
    var timeRegExpArr = lyric.match(timeReg);
    if(!timeRegExpArr)continue;
    var clause = lyric.replace(timeReg,'');
    for(var k = 0,h = timeRegExpArr.length;k < h;k++) {
    var t = timeRegExpArr[k];
    var min = Number(String(t.match(/\[\d*/i)).slice(1)),
    sec = Number(String(t.match(/\:\d*/i)).slice(1));
    var time = min * 60 + sec;
    lrcObj[time] = clause;
    }
  }
  return lrcObj;
}

强制刷新当前时间点歌词

// 强制刷新当前时间点的歌词
// 参数:当前播放时间(单位:秒)
function refreshLyric(time) {
  if(lyricText === '') return false;

  time = parseInt(time); // 时间取整
  var i = 0;
  for(var k in lyricText){
  if(k >= time) break;
  i = k; // 记录上一句的
  }

  scrollLyric(i); //滚动歌词到自定语句方法下面
}

滚动歌词都指定语句

// 滚动歌词到指定句
// 参数:当前播放时间(单位:秒)
function scrollLyric(time) {
  if(lyricText === '') return false;

  time = parseInt(time); // 时间取整

  if(lyricText === undefined || lyricText[time] === undefined) return false; // 当前时间点没有歌词

  if(lastLyric == time) return true; // 歌词没发生改变

  var i = 0; // 获取当前歌词是在第几行
  for(var k in lyricText){
  if(k == time) break;
  i ++;
  }
  lastLyric = time; // 记录方便下次使用
  $(".lplaying").removeClass("lplaying"); // 移除其余句子的正在播放样式
  $(".lrc-item[data-no='" + i + "']").addClass("lplaying"); // 加上正在播放样式

  var scroll = (lyricArea.children().height() * i) - ($(".lyric").height() / 2);
  lyricArea.stop().animate({scrollTop: scroll}, 1000); // 平滑滚动到当前歌词位置(更改这个数值可以改变歌词滚动速度,单位:毫秒)
}

(1)H5实现音乐播放器【正在播放-歌词篇】的更多相关文章

  1. 解决Ubuntu14.04下Clementine音乐播放器不能播放wma文件的问题

    参考:Ubuntu 14.04 安装深度音乐的方法 问题描述:播放wma文件时提示"GStreamer插件未安装". 解决方法:安装gstreamer-ffmpeg插件即可解决问题 ...

  2. js-音乐播放器,播放|暂停|滑块的功能

    音乐播放器,播放|暂停|滑块的功能 document.addEventListener('DOMContentLoaded', function loaded(event) { var audio = ...

  3. iOS 多个播放器同时播放,双击全屏,单击退出全屏

    前言:公司需求如下:点击一个按钮播放一个视频,最多同时播放4个:双击某视频让其全屏,单击再恢复原来的样子.IOS的播放器有两种,MPMoviePlayerController,AVAudioPlaye ...

  4. 百度播放器SDK 播放MP4格式视频有声音无画面问题解决

    此处为记录解决过程. 所链接使用的MP4格式视频为codec id是mp4v-20.使用手机自带播放器可以播放,使用百度云媒体播放器不能无画面.经调试,Android Baidu-Cloud-Play ...

  5. java调用本地播放器播放视频文件。调用本地播放器不能播放指定文件的说明。

    public class OpenExe extends HttpServlet { //打开本地播放器并播放视频 public static void openExe(String file) { ...

  6. phongap开发中安卓平台上如何调用第三方播放器来播放HLS视频

    前文曾经讲了关于在安卓平台上利用phonegap开发播放HLS的解决方案,其实最好的方案就是自己针对HLS视频开发自己的播放器,但是开发播放器是一个浩大的工程,必须对原生安卓开发非常熟悉,并且对视频播 ...

  7. 【转】C# 视频监控系列(13):H264播放器——控制播放和截图

    本文原文地址:http://www.cnblogs.com/over140/archive/2009/03/30/1421531.html 阿里云栖社区也有相关的视频开发案例:https://yq.a ...

  8. IOS 集成 Bilibili IJKPlayer播放器,播放rtmp视频流

    因为公司项目需要,我一个连iPhone都没用过的人竟然跑去开发iOS APP.近一段时间一直忙于赶项目,到今天差不多了,所以记录一下当时遇到的各种坑,先从ios 集成 ijkplayer播放器说起! ...

  9. 利用Docker挂载Nginx-rtmp(服务器直播流分发)+FFmpeg(推流)+Vue.js结合Video.js(播放器流播放)来实现实时网络直播

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_75 众所周知,在视频直播领域,有不同的商家提供各种的商业解决方案,其中比较靠谱的服务商有阿里云直播,腾讯云直播,以及又拍云和网易云 ...

  10. Android音乐播放器源码(歌词.均衡器.收藏.qq5.0菜单.通知)

    一款Android音乐播放器源码,基本功能都实现了 qq5.0菜单(歌词.均衡器.收藏.qq5.0菜单.通知) 只有向右滑动出现,菜单键和指定按钮都还没有添加. 源码下载:http://code.66 ...

随机推荐

  1. Linux - route & traceroute & ip

    route route - show / manipulate the IP routing table route 命令常用命令示例 #显示路由 route route -n # 不解析名字,快速显 ...

  2. 8 Ways to Become a Better Coder

    It’s time to get serious about improving your programming skills. Let’s do it! That’s an easy career ...

  3. C++ 操作符、局部 全局变量及自动转换原则

    1.&:表示与操作,eg:2&1=2&&:表示and操作,eg:1&&0=0|:表示或操作,eg:2|1=3||:表示or操作,eg:1||0=12.全 ...

  4. 计算机网络 之 TCP协议报文结构

    前言:上学期实训课,由于要做一个网络通信的应用,期间遇到各种问题,让我深感计算机网络知识的薄弱.于是上网查找大量的资料,期间偶然发现了roc大神的博客,很喜欢他简明易懂的博文风格.本文受roc的< ...

  5. C++学习知识点

    所谓的学习,知识只是一部分,理解知识是如何被抽象和提炼的过程,才是更重要的 1.c++代码里面的\(反斜杠) C语言的宏要求只能在同一行,是不能跨行的.这里的反斜杠就是告诉编译器,我这里虽然换行了,但 ...

  6. JavaScript -- Window-Scroll

    -----037-Window-Scroll.html----- <!DOCTYPE html> <html> <head> <meta http-equiv ...

  7. spring mvc 404页面制作

    1.404页面 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  8. 阿里2015校招面试回忆录(成功拿到offer)

    1. 引言 继上次“百度2015校园招聘面试题回忆录(成功拿到offer)”文章过后,大家都希望除了题目之外,最好能给出自己当时的回答情况,看看有没有什么回答技巧,这样更有参考价值. 嗯,建议的很对, ...

  9. scala-传名函数和传值函数

    Scala的解释器在解析函数参数(function arguments)时有两种方式:先计算参数表达式的值(reduce the arguments),再应用到函数内部:或者是将未计算的参数表达式直接 ...

  10. Entity Framework 6.x - Code First 默认创建数据库的位置

    在集成DbContext的派生类中的构造函数里,如果没有指定配置文件中的数据库连接字符串的name,默认就是: Data Source=(localdb)\MSSQLLocalDB;Initial C ...