微信小程序> 微信小程序带可拖动进度条和时间显示的音频播放器

微信小程序带可拖动进度条和时间显示的音频播放器

浏览量:2171 时间: 来源:C沉冰

已更新更为强大版本的具有背景播放功能的播放器,以下为传送门:

https://blog.csdn.net/qq_42228034/article/details/100578572

此版本仅具有参考意义

周知,微信官方自带的音频播放器是没有进度条的,为了实现有进度条,并且拖动,只能自己写一个了;

下面是演示图

①页面加载完成后,能够直接显示音频的时长

②播放时,进度条变化,播放时间变化,拖动进度条可以跳转到改进度播放

话不多说,直接上代码

首先是微信官方所提倡的代码片段的方式:

wechatide://minicode/0tLe2xmA7x2O

      如果不能用那么请使用以下代码:

wxml:

<view class='audioPlayer'>  <view class='player'>    <image src='{{audiolist[0].coverimg}}' class='audioBack'></image>    <view class='audioControls'>      <view class='flex'>        <view class='bottom' catchtap='playAudio'>          <!-- 按钮 -->          <view wx:if="{{isPlayAudio}}">            <image src='../../assets/pause.png' />          </view>          <view wx:else>            <image src='../../assets/play.png' />          </view>        </view>        <view class='slider'>          <slider bindchange='sliderChange' activeColor='red' block-size="12" value='{{audioTime}}' />        </view>        <view class='time'>          {{showTime1}}/{{showTime2}}        </view>      </view>    </view>  </view></view>

wxss:

.flex{  display: flex;}.audioPlayer{  width: 100%;  height: 400rpx;  margin-bottom: 30rpx;  box-sizing: border-box;  padding: 20rpx 30rpx;}.player{  width: 100%;  height: 100%;  position: relative;}.audioBack{  width: 100%;  height: 100%;}.audioControls{  width: 100%;  height: 80rpx;  background: black;  opacity: .8;  position: absolute;  bottom: 0;  color: white;  font-size: 6pt;  line-height: 80rpx;  text-align: center;}.audioControls .bottom{  width: 60rpx;  height: 100%;}.audioControls .bottom image{  margin-top: 30%;  margin-left: 30%;  width: 40rpx;  height: 40rpx;}.audioControls .slider{  width: 520rpx;  height: 100%;}.slider slider{  width: 95%;  margin-left: 4%;  margin-right: 0;}.audioControls .time{  width: 120rpx;  height: 100%;}

js:

const app = getApp()const innerAudioContext = wx.createInnerAudioContext();Page({  data: {    audiolist:[      {        audiosrc:'http://other.web.rh01.sycdn.kuwo.cn/resource/n2/16/17/450264753.mp3',        coverimg:"https://goss.veer.com/creative/vcg/veer/800water/veer-146156021.jpg"      }    ],    isPlayAudio: false,    audioSeek: 0,    audioDuration: 0,    showTime1: '00:00',    showTime2: '00:00',    audioTime: 0  },  onLoad: function () {      },  onShow:function(){    this.Initialization();    this.loadaudio();  },  //初始化播放器,获取duration  Initialization(){    var t=this;    if (this.data.audiolist[0].audiosrc.length != 0) {      //设置src      innerAudioContext.src = this.data.audiolist[0].audiosrc;      //运行一次      innerAudioContext.play();      innerAudioContext.pause();      innerAudioContext.onCanplay(() => {        //初始化duration        innerAudioContext.duration        setTimeout(function () {          //延时获取音频真正的duration          var duration = innerAudioContext.duration;          var min = parseInt(duration / 60);          var sec = parseInt(duration % 60);          if (min.toString().length == 1) {            min = `0${min}`;          }          if (sec.toString().length == 1) {            sec = `0${sec}`;          }          t.setData({ audioDuration: innerAudioContext.duration, showTime2: `${min}:${sec}` });        }, 1000)      })    }  },  //拖动进度条事件  sliderChange(e) {    var that = this;    innerAudioContext.src = this.data.audiolist[0].audiosrc;    //获取进度条百分比    var value = e.detail.value;    this.setData({ audioTime: value });    var duration = this.data.audioDuration;    //根据进度条百分比及歌曲总时间,计算拖动位置的时间    value = parseInt(value * duration / 100);    //更改状态    this.setData({ audioSeek: value, isPlayAudio: true });    //调用seek方法跳转歌曲时间    innerAudioContext.seek(value);    //播放歌曲    innerAudioContext.play();  },  //播放、暂停按钮  playAudio() {    //获取播放状态和当前播放时间    var isPlayAudio = this.data.isPlayAudio;    var seek = this.data.audioSeek;    innerAudioContext.pause();    //更改播放状态    this.setData({ isPlayAudio: !isPlayAudio })    if (isPlayAudio) {      //如果在播放则记录播放的时间seek,暂停      this.setData({ audioSeek: innerAudioContext.currentTime });    } else {      //如果在暂停,获取播放时间并继续播放      innerAudioContext.src = this.data.audiolist[0].audiosrc;      if (innerAudioContext.duration != 0) {        this.setData({ audioDuration: innerAudioContext.duration });      }      //跳转到指定时间播放      innerAudioContext.seek(seek);      innerAudioContext.play();    }  },  loadaudio() {    var that = this;    //设置一个计步器    this.data.durationIntval = setInterval(function () {      //当歌曲在播放时执行      if (that.data.isPlayAudio == true) {        //获取歌曲的播放时间,进度百分比        var seek = that.data.audioSeek;        var duration = innerAudioContext.duration;        var time = that.data.audioTime;        time = parseInt(100 * seek / duration);        //当歌曲在播放时,每隔一秒歌曲播放时间+1,并计算分钟数与秒数        var min = parseInt((seek + 1) / 60);        var sec = parseInt((seek + 1) % 60);        //填充字符串,使3:1这种呈现出 03:01 的样式        if (min.toString().length == 1) {          min = `0${min}`;        }        if (sec.toString().length == 1) {          sec = `0${sec}`;        }        var min1 = parseInt(duration / 60);        var sec1 = parseInt(duration % 60);        if (min1.toString().length == 1) {          min1 = `0${min1}`;        }        if (sec1.toString().length == 1) {          sec1 = `0${sec1}`;        }        //当进度条完成,停止播放,并重设播放时间和进度条        if (time >= 100) {          innerAudioContext.stop();          that.setData({ audioSeek: 0, audioTime: 0, audioDuration: duration, isPlayAudio: false, showTime1: `00:00` });          return false;        }        //正常播放,更改进度信息,更改播放时间信息        that.setData({ audioSeek: seek + 1, audioTime: time, audioDuration: duration, showTime1: `${min}:${sec}`, showTime2: `${min1}:${sec1}` });      }    }, 1000);  },  onUnload:function(){    //卸载页面,清除计步器    clearInterval(this.data.durationIntval);  }})

wxml里面的两张图片是在assets目录下的2个图片,一张为播放,一张为暂停

   

 

下面是私货:

       在我进行开发的时候,还没有搭建自己的服务器,在线音源很难找,后面找到两篇帖子讲的是如何获取酷我音乐的音乐真实路径;我根据那两篇帖子,写了一个简单的nodeJs的demo;(以下为nodejs代码)

      首先进入酷我音乐,打开歌曲详情播放页面,找到地址栏中的神秘数字

      如:http://www.kuwo.cn/yinyue/54436859?catalog=yueku2016 中就是   54436859

     使用node或者webstorm等运行下方js,在地址栏输入 localhost:8080?id=神秘数字

      单击回车,页面就会显示歌曲的真实路径,然后就可以在自己想引用的地方使用了;

     (本方法编辑于2018/09/19)

//酷我音乐,音乐路径抓取//网址:http://www.kuwo.cnvar http = require('http');var url=require('url');var reg1=/<mp3dl>/;var reg2=/</mp3dl>/;var reg3=/<mp3path>/;var reg4=/</mp3path>/;http.createServer(function(req,res1){    if(req.url!='/favicon.ico'){        //音乐的id,先进入歌曲详情播放页,在地址栏中http://www.kuwo.cn/yinyue/40425292?catalog=yueku2016   在yinyue/ 后方 ? 前方的数字, 如 40425292        var musicId=req.url.split('=');        musicId=musicId[1];        var url = 'http://player.kuwo.cn/webmusic/st/getNewMuiseByRid?rid=MUSIC_'+musicId;        http.get(url, function(res) {            var html = '';            // 获取页面数据            res.on('data', function(data) {                html += data;            });            // 数据获取结束            res.on('end', function() {                var mp3dl=html.split(reg1);                mp3dl=mp3dl[1].split(reg2);                var mp3path=html.split(reg3);                mp3path=mp3path[1].split(reg4);                var outPut='http://'+mp3dl[0]+'/resource/'+mp3path[0];                res1.end(outPut);            });        }).on('error', function() {            console.log('获取数据出错!');        });    }}).listen(8001);

 

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

最新资讯

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎