(1)H5实现音乐播放器【正在播放-歌词篇】
近期闲来无事,就想着复习一下前端的东西,然后正好跟朋友搞了一个公共开放的音乐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实现音乐播放器【正在播放-歌词篇】的更多相关文章
- 解决Ubuntu14.04下Clementine音乐播放器不能播放wma文件的问题
参考:Ubuntu 14.04 安装深度音乐的方法 问题描述:播放wma文件时提示"GStreamer插件未安装". 解决方法:安装gstreamer-ffmpeg插件即可解决问题 ...
- js-音乐播放器,播放|暂停|滑块的功能
音乐播放器,播放|暂停|滑块的功能 document.addEventListener('DOMContentLoaded', function loaded(event) { var audio = ...
- iOS 多个播放器同时播放,双击全屏,单击退出全屏
前言:公司需求如下:点击一个按钮播放一个视频,最多同时播放4个:双击某视频让其全屏,单击再恢复原来的样子.IOS的播放器有两种,MPMoviePlayerController,AVAudioPlaye ...
- 百度播放器SDK 播放MP4格式视频有声音无画面问题解决
此处为记录解决过程. 所链接使用的MP4格式视频为codec id是mp4v-20.使用手机自带播放器可以播放,使用百度云媒体播放器不能无画面.经调试,Android Baidu-Cloud-Play ...
- java调用本地播放器播放视频文件。调用本地播放器不能播放指定文件的说明。
public class OpenExe extends HttpServlet { //打开本地播放器并播放视频 public static void openExe(String file) { ...
- phongap开发中安卓平台上如何调用第三方播放器来播放HLS视频
前文曾经讲了关于在安卓平台上利用phonegap开发播放HLS的解决方案,其实最好的方案就是自己针对HLS视频开发自己的播放器,但是开发播放器是一个浩大的工程,必须对原生安卓开发非常熟悉,并且对视频播 ...
- 【转】C# 视频监控系列(13):H264播放器——控制播放和截图
本文原文地址:http://www.cnblogs.com/over140/archive/2009/03/30/1421531.html 阿里云栖社区也有相关的视频开发案例:https://yq.a ...
- IOS 集成 Bilibili IJKPlayer播放器,播放rtmp视频流
因为公司项目需要,我一个连iPhone都没用过的人竟然跑去开发iOS APP.近一段时间一直忙于赶项目,到今天差不多了,所以记录一下当时遇到的各种坑,先从ios 集成 ijkplayer播放器说起! ...
- 利用Docker挂载Nginx-rtmp(服务器直播流分发)+FFmpeg(推流)+Vue.js结合Video.js(播放器流播放)来实现实时网络直播
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_75 众所周知,在视频直播领域,有不同的商家提供各种的商业解决方案,其中比较靠谱的服务商有阿里云直播,腾讯云直播,以及又拍云和网易云 ...
- Android音乐播放器源码(歌词.均衡器.收藏.qq5.0菜单.通知)
一款Android音乐播放器源码,基本功能都实现了 qq5.0菜单(歌词.均衡器.收藏.qq5.0菜单.通知) 只有向右滑动出现,菜单键和指定按钮都还没有添加. 源码下载:http://code.66 ...
随机推荐
- [Leetcode]316.去除重复字母
题目 贪心方法 用一个两个数组vector<int>cnt,vector<bool>in_right_place: string res:目前符合条件的字符串,到代码结束的时候 ...
- Vue2.5开发去哪儿网App 首页开发
主页划 5 个组件,即 header icon swiper recommend weekend 一. header区域开发 1. 安装 stylus npm install stylus --s ...
- js 开发过程中经验及总结记录
一 let 和 var 作用域 1 普通用法 for (var i = 0; i < 5; i++) { console.log(i); } console.log(i); //-- ...
- (转)【学习笔记】通过netstat+rmsock查找AIX端口对应进程
原文:http://www.oracleplus.net/arch/888.html https://www.ibm.com/support/knowledgecenter/zh/ssw_aix_72 ...
- Windows server2012 IIs 8 自定义日志记录
问题: 通过CDN加速的网站,记录日志时无法追踪源IP,日志的IP都为CDN节点ip. 分析: 1.在解析记录header时,CDN实际会把源IP以其它header的形式回传,如网宿为[Cdn-Src ...
- Centos7 开启端口
CentOS7默认没有使用iptables,所以通过编辑iptables的配置文件来开启80端口是不可以的. CentOS 7 采用了 firewalld 防火墙. 如要查询是否开启80端口: [ro ...
- java中this$0 this$1 this$2
import java.lang.reflect.Field; public class Outer {//this$0 public class FirstInner {//this$1 publi ...
- 【JS】for in循环对象,hasOwnProperty()的作用
var obj = { name:"echolun", age:", sex:"male" }, objName=[], //用来装对象属性名 obj ...
- Css相关用法个人总结
Css相关用法个人总结
- C# 枚举器和迭代器
一.枚举器(enumerator)和可枚举类型(enumeration) 我们都知道foreach语句可以用来遍历数组中的元素,但你有没有想过为什么它可以被foreach处理呢? 这是因为数组可以按需 ...