vue+express实现音乐播放器
vue+express实现音乐播放器
效果图
因为html中的audio的样式不能更改,所以我们自己制作UI,做成自己想要的样子,这样要实现滑动条跟audio的双向绑定,滑动条使用了vant的组件slider,audio单向绑定到slider我们通过监听勾子 timeupdate
<audio @canplay="canplay" preload="preload" @timeupdate="updateTime" ref="audio" :src="music"></audio>
下面的这个是实时监听函数
updateTime(e) {for (var i = 0, l = geci.length; i < l; i++) {if (e.target.currentTime > geci[i][0]) {this.$refs.passage.innerHTML = geci[i][1];}} this.current = e.target.currentTime;if (this.count % 2 == 0) { this.value = (e.target.currentTime * 100) / this.time;if(isNaN(this.value)){this.value=0}} if (this.value == 100) {this.show = true;this.value = 0;if(this.index!=this.music_list.length-1){this.index=this.index+1;this.music='http://localhost:3000/'+this.music_list[this.index]new Promise((resolve,reject)=>{this.$refs.audio.load()setTimeout(()=>{resolve()},1000)}).then(()=>{this.$refs.audio.play()})}else{return}}},
这个函数前一部分for循环
for (var i = 0, l = geci.length; i < l; i++) {if (e.target.currentTime > geci[i][0]) {this.$refs.passage.innerHTML = geci[i][1];}}
是歌词的处理,后面会讲到,判断
if (this.count % 2 == 0) //这个判断是解除双向绑定的冲突的,后面会讲到,
这个判断是解除双向绑定的冲突的,后面也会讲到,
Value是slider的百分比,我们通过当前时间乘以100在除以总时间来获得。总时间的获得我们通过canplay函数来监听,
canplay() {this.time = this.$refs.audio.duration;console.log(this.time)},
if (this.value == 100) {this.show = true;this.value = 0;if(this.index!=this.music_list.length-1){this.index=this.index+1;this.music='http://localhost:3000/'+this.music_list[this.index]new Promise((resolve,reject)=>{this.$refs.audio.load()setTimeout(()=>{resolve()},1000)}).then(()=>{this.$refs.audio.play()})}else{return}
这一部分我们是当音乐播放完那么value是100所以我们要播放下一首歌,要先判断歌单里是否有还有歌曲,如果有则进行下一曲,然后在执行play继续播放,这边播放遇到了一个问题就是audio的play好像是个异步,所以我们load之后在等1秒钟然后在.then中执行play这样就能正常播放到下一首了。如果已经是最后一首了就return。Audio绑slider就到这。
接下来是slider绑定audio
<van-slider@drag-end="end"@drag-start="start"class="s"button-size="10px"v-model="value"@change="onChange"
/>
我们通过slider的change来绑定
onChange(value) {this.$refs.audio.play()this.show = true;/* console.log(value);console.log(this.time);console.log(value * this.time); *//* let tt=9 *//* console.log( this.$refs.audio.currentTime) */let tt = Math.floor((value * this.time) / 100); this.$refs.audio.currentTime = tt;},
就通过简单的计算来绑定audio的currentime,因为双向绑定所以在我们移动的时候,audio会一直影响进度条,我们slider向audio绑定的时候,audio也会向我们产生绑定这样我们的小圆点就会一直跳来跳去。所以我们就对在audio的监听函数中来进行判断是否移动slider小圆点,所以才会有之前的判断
start() {this.count = (this.count + 1) % 2; },end() {this.count = (this.count + 1) % 2; },
按下小圆点和松开小圆点每次都对count进行+1取余即可,监听函数就像上面所看到的一样判断this.count为1和为0即可。
获取歌单
我们没有显示到界面上,因为懒得做,所以我们用express发送我们的歌单
后台路由
router.get('/getall',function(req,res,next){let result=fs.readdirSync('./public')res.json(result)
})
就一个简单的文件读取,然后我们开启静态服务就可以根据url去访问特定的文件了。
前台接收
Axios发送请求,在created中执行
created() {axios({url: "http://localhost:3000/getall",method: "get"}).then(response => {console.log(response)this.music = 'http://localhost:3000/'+response.data[0];this.music_list = response.data;}).catch(err => {console.log(err);});},
初始化music即audio的src,为第一个把url补全即可,然后把整个歌单都给music_list即可
这边我们的界面播放暂停和音量slider是否弹出是通过vue的v-show和flex布局来实现的。这边就不说了。懂得都懂。
下一首歌
next() {if (this.index == this.music_list.length-1) {return;} else {new Promise((reslove, reject) => {this.index = this.index + 1;this.music ='http://localhost:3000/'+ this.music_list[this.index];setTimeout(() => reslove(), 1000);}).then(() => {this.$refs.audio.play();this.show = true;});}},
下一首歌的函数,首先判断是否为最后一首,如果是则return,不是则index索引+1然后this.music赋值为music_list[index]然后play这边也封装在一个promise中以防万一。。。。
上一首歌一样的道理就不多说了直接上代码
pre() {if (this.index == 0) {return;} else {new Promise((reslove, reject) => {this.index = this.index - 1;this.music = 'http://localhost:3000/'+this.music_list[this.index];setTimeout(() => reslove(), 1000);}).then(() => {this.show = true;this.$refs.audio.play();});}}
音量的处理很简单通过代表音量slider的value值来进行赋值就行,
changevoice(){this.$refs.audio.volume=(100-this.voice)/100},
简单的一个百分比到小数的处理,audio的音量为小数,1为最大
最后这个时间的处理左边的就实时获取就上面讲到的一个函数,总时间也是,然后我们写了个过滤器
filters: {changetime: function(value) {if (Math.floor(value % 60) < 10) {return Math.floor(value / 60) + ":0" + Math.floor(value % 60);} else {return Math.floor(value / 60) + ":" + Math.floor(value % 60);}}},
来标准化时间,个位数就补0即可
使用就跟下面这样就行
<div class="times">{{current|changetime}}/{{time|changetime}}</div>
最后是歌词的处理,这边我只处理了一首歌。后面的处理都一样的。
我们时使用irc文件他的格式类似key,value,[时间,歌词]
就跟下面这样子一样
[ 0, 'RISE 登峰造极境 - The Glitch Mob/Mako/The Word Alive' ],[ 3.39, '词:英雄联盟/The Glitch Mob/Mako/The Word Alive' ],[ 6.79, '曲:英雄联盟/The Glitch Mob/Mako/The Word Alive' ],[ 10.19, 'Welcome to the wild no heroes and villains' ],[ 15.5, "Welcome to the war we've only begun so" ],[ 20.84, 'Pick up your weapon and face it' ],[ 23.46, "There's blood on the crown go and take it" ],
这是我已经处理好的样子,我用node处理讲一句放在数组中形式为[时间,歌词],然后全部歌词就放在一个[[时间,歌词]]中。然后放在对audio的实时监听中,函数如下就之前上面放过了就updatetime函数中的
for (var i = 0, l = geci.length; i < l; i++) {if (e.target.currentTime > geci[i][0]) {this.$refs.passage.innerHTML = geci[i][1];}}
这一部分然后把就这样显示了。
这边歌词我没有从后端发送。因为要读文件然后输出有一些异步处理。我是直接放在了一个前端的js文件中,就像这样
exports.geci=[[ 0, 'RISE 登峰造极境 - The Glitch Mob/Mako/The Word Alive' ],[ 3.39, '词:英雄联盟/The Glitch Mob/Mako/The Word Alive' ],[ 6.79, '曲:英雄联盟/The Glitch Mob/Mako/The Word Alive' ],[ 10.19, 'Welcome to the wild no heroes and villains' ],[ 15.5, "Welcome to the war we've only begun so" ],[ 20.84, 'Pick up your weapon and face it' ],
然后在组件中引入
中间的图片也不过多说,可以旋转用的css动画实现css代码:
img {margin-top: 150px;border-radius: 200px;width: 200px;height: 200px;animation: change 6s linear;animation-iteration-count: infinite;
}
@keyframes change {from {transform: rotate(0deg);}to {transform: rotate(360deg);}
}
就这样子的。
然后我这边就差不多就这么多。
心得体会
这边就差不多花了一天时间,踩了一个坑解决就花了大半天。踩得坑是koa的静态服务,如果我获取的是koa开启的静态服务的url那么audio的进度条是不能移动的导致我卡在了这边一直到最后也没解决,所以我最后使用了express来启动静态服务。其他的地方的话就一些audio的异步处理,将它放在promise中也顺利解决了。界面UI有点丑,可以有很多优化的地方,但大致功能播放音乐,音乐的切换,歌词的显示这些基本功能都实现了。
要是想要源码可以加qq547783781
vue+express实现音乐播放器相关推荐
- Vue实现仿音乐播放器项目总述以及阶段目录
Github地址 https://github.com/badaoliumang/vuemusicplayer Vue实现仿音乐播放器各阶段代码 https://download.csdn.net/d ...
- Vue实现仿音乐播放器6-实现新歌速递与swiper轮播图切换
前言 前面在首页已经完成今日推荐以及访问百度API获取数据,现在继续来完善home主页. 效果 新歌速递 swiper实现轮播图 实现 实现新歌速递 在components下新建新歌速递组件News_ ...
- Vue实现仿音乐播放器3-将项目托管到git以及github
Github新建项目 1.登录github,点击右上角新建仓库 2.输入仓库名以及描述等,点击Create resposity 3.新建仓库完成后,右边有个clone or download,复制SS ...
- vue 判断同一数组内的值是否一直_前端代码+后端API,值得一学的Vue高仿音乐播放器实战项目
项目名称:vue-fds_music 项目作者:符道胜 开源许可协议:Apache-2.0 项目地址:https://gitee.com/fudaosheng/vue-fds_music 项目简介 V ...
- 用Vue制作简易音乐播放器(超详细)
先放个效果图吧 首先先把主体结构搭好,样式调好,然后再来写播放器的功能. 根据播放器的形状,将其分为头部(搜索栏),中间(歌曲列表,碟片,热评),尾部(播放器栏),html结构如下 <div c ...
- 用vue做一个音乐播放器
xz-music 音乐播放器(web移动端) 开源协议MIT License github: https://github.com/huangweizhi/xz-music.git gitee: ht ...
- 后端实体类接收数组_前端代码+后端API,值得一学的Vue高仿音乐播放器实战项目...
项目名称:vue-fds_music 项目作者:符道胜 开源许可协议:Apache-2.0 项目地址:https://gitee.com/fudaosheng/vue-fds_music 项目简介 V ...
- 前端代码+后端API,值得一学的Vue高仿音乐播放器实战项目
项目名称:vue-fds_music 项目作者:符道胜 开源许可协议:Apache-2.0 项目地址:https://gitee.com/fudaosheng/vue-fds_music 项目简介 V ...
- vue 音乐盒app_基于Vue.js的音乐播放器(Webapp)
概述 项目是基于Vue.js,成品是一个移动端的音乐播放器,来源于imooc的实战课程.自己动手实践并加以修改拓展. 项目的大致流程是Vue-cli构建开发环境,分析需求,设计构思,规划目录结构,开始 ...
最新文章
- opencv 显示图片
- 16、HTML密码框
- 错误:用脚本window.showModalDialog打开的页面,点击button时打开新窗口
- linux指定内核位置,ARM linux内核启动时几个关键地址
- ofstream/ifstream 文本/二进制 方式 读入/写出 数据方法
- 从前端开发者看待用友建筑云移动端单点登录与报错原因
- 拓端tecdat|Python使用GARCH,EGARCH,GJR-GARCH模型和蒙特卡洛模拟进行股价预测
- 大学物理光学思维导图_思维导图真的需要学吗?(附资料)
- 对象锁 区别 类锁
- 注塑模设计必懂的知识
- 菜鸟和老鸟都无法避免的问题——未将对象引用设置到对象的实例
- 1.18 物主代词 形容词 宾语从句
- 致加西亚的信 谁动了我的奶酪
- 2.5 第九讲 一阶微分方程的计算
- (附源码)spring boot图书管理系统 毕业设计160934
- PHP的implode函数运用,什么是PHP中的implode()函数?
- 计算机c盘是内存还是外存,rom是内存还是外存?
- Matlab的residuez和residue的区别,举例
- mysql求回购率_回购利率计算方法
- $.inArray函数判断数组中的是否包含字符串
热门文章
- vue由浅入深的50个知识点
- 模仿写的优酷客户端应用源码
- QQ邮箱停运,如何使用网易163邮箱实现邮件发送。
- 【Python】将文件夹压缩成zip包
- 教你用CSS3画一个透视、旋转的正方体
- QQ浏览器video标签不显示第一帧解决
- mysql 增加列 before_mysql添加、修改、删除字段
- 精益安灯电子看板实现了实时监测
- QQ宣布即将关停这功能,网友炸了 !!!
- windows下php连接oracle安装oci8扩展报错(PHP Startup: Unable to load dynamic library ‘oci8_11g‘)