近期闲来无事,就想着复习一下前端的东西,然后正好跟朋友搞了一个公共开放的音乐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. js变量提升

    JavaScript的函数定义有个特点,它会先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部: 'use strict'; function foo() { var x = 'Hello, ...

  2. Build OpenJdk

    1  ,下载源代码  nuget 2,说明文档 http://hg.openjdk.java.net/jdk8/jdk8/raw-file/tip/README-builds.html 2,安装 Cy ...

  3. 剑指offer十一之二进制中1的个数

    一.题目 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 二.思路 方法一: 用1(1自身左移运算,其实后来就不是1了)和n的每位进行位与,来判断1的个数 方法二: 把一个整数减去1 ...

  4. (转)实现一个cache装饰器,实现过期可清除功能

    原文:http://www.cnblogs.com/JerryZao/p/9574927.html http://blog.51cto.com/11281400/2107790-----装饰器应用练习 ...

  5. 一个对眼睛很好的vim 颜色主题

    地址:https://github.com/altercation/vim-colors-solarized 安装: $ cd vim-colors-solarized/colors $ mv sol ...

  6. C# 多线程七之Parallel

    1.简介 关于Parallel不想说太多,因为它是Task的语法糖,至少我是这么理解的,官方文档也是这么说的,它本身就是基本Task的.假设我们有一个集合,不管是什么集合,我们要遍历它,首先想到的是F ...

  7. TFS2018环境搭建一单实例安装(适用于小型团队)

    1.服务器配置 阿里云 单核CPU,2GB的RAM,SSD硬盘,安装TFS实例 TFS2018要求SQL Server 2016 (minimum SP1)以上.其要求有以下几点: (1).安装SQL ...

  8. IDEA中Git的使用基础

    场景概述 工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下: 假设小组中有两个人,组长小张,组员小袁 场景一:小张创建项目并提交到远程Git仓库 场景二:小袁从远程Git仓库上获取项目源码 ...

  9. linux less命令详情

    less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more .tail更加的有弹性.在 more 的时候,我们并没有办 ...

  10. java的classLoader分析与jettty的WebAppClassLoader

    classLoader,从名字就可以知道,用于加载class的东西. 我们知道在Java中,源文件是会被编译成class文件的,我们的程序的运行也是需要依赖这些编译成字节码的class文件,而这些字节 ...