微信小程序:音频播放器

由于产品需求,需要做一个自定义音频播放器,现在也差不多做完了,接下来呢,给大家分享一下,大家先来看看效果图哦~

播放器.gif
这里呢,我选择的是 wx.createInnerAudioContext 这个方法,大家可以结合文档来看这篇文章哦~

wxml

<view class="audios">
  <view class="play_pause_btn" bindtap="stratPlay">
    <image class="btn" wx:if="{{!isplay}}" src="../../assets/image/correctAudios/play.png"></image>
    <image class="btn" wx:else src="../../assets/image/correctAudios/pause.png"></image>
  </view>
  <view class="play_process">
    <view style="font-size: 22rpx;font-family:Helvetica;">{{startTime}}</view>
      <view class="slider_out" style="width: {{selfSliderWidth}}">
        <slider data-offset="{{processLen}}" style="width: 95%;margin-left: 10rpx;" bindchange='sliderChange' bindtouchstart="handleSliderMoveStart" bindtouchend="handleSliderMoveEnd" value="{{processLen}}" min="0" max="100" step="1" activeColor='#000' block-size="12" backgroundColor="rgba(199,199,204,1)"/>
      </view>
    <view style="font-size: 22rpx;font-family:Helvetica;">{{endTime}}</view>
  </view>
</view>

js: 1、初始化状态

data() {
    url: '',
    duration: '',
    myAudio: '',
    startTime: '00:00',
    endTime: '00:00',
    isplay: false,
    processLen: 0,
    isMovingSlider: false,
},
onReady(){
     this.data.myAudio = wx.createInnerAudioContext();
      this.data.myAudio.src = this.data.url;
      wx.setInnerAudioOption({  
        obeyMuteSwitch: false  
      })
      this.data.endTime = setTimes(this.data.duration);
      this.data.myAudio.seek(0);
      this.setData({
        isplay: false,
        startTime: '00:00',
        endTime: this.data.endTime,
        processLen: 0,
     })
}

js: 2、点击播放、暂停、以及播放的进度

this.data.isplay = !this.data.isplay;
if(this.data.isplay) {
      this.data.myAudio.play();
      setTimeout(() => {
           this.data.myAudio.paused;
      }, 200)
 } else { 
      this.data.myAudio.pause();
 }

 this.setData({
    isplay: this.data.isplay
 })

 // 播放中...
 this.data.myAudio.onTimeUpdate(() => {
       if(!this.data.isMovingSlider) {
           let per = (this.data.myAudio.currentTime this.data.myAudio.duration) * 100;
           this.setData({
              startTime: setTimes(this.data.myAudio.currentTime),
              processLen: per
            })
        }
  })
        
  // 播放结束
  this.data.myAudio.onEnded(() => {
     this.setData({
         isplay: false,
         startTime: "00:00",
         processLen: 0
      })
   })
        
   // 播放出错
    this.data.myAudio.onError((err) => {
         console.log('audio error => ', err)
    })

js: 3、进度条的拖拽

 sliderChange(e) {
      let long = (e.detail.value * this.data.duration) / 100;
      this.data.myAudio.seek(long);
          this.data.myAudio.pause();
          setTimeout(() => {
             this.data.myAudio.play();
          })
     }, 500)

     this.setData({
         isplay: true,
         startTime: setTimes(long)
     })
 }
// 解决onTimeUpdate事件触发slider控件更新”和“手动拖动触发slider更新”冲突的问题
 handleSliderMoveStart() {
    this.setData({
        isMovingSlider: true
    });
 },

 handleSliderMoveEnd() {
    this.setData({
        isMovingSlider: false
    });
 }

js: 4、销毁音频实例

onUnload() {
    this.data.myAudio.destory()
}

wxss

.audios {
    display: flex;
    align-items: center;
    height: 88rpx;
    padding: 0 40rpx;
    margin: 0 auto;
    box-sizing: border-box;
    background:rgba(255,255,255,1);
    box-shadow: 2rpx 2rpx 12rpx 0rpx rgba(199,199,204,0.6);
    border-radius: 20rpx;
}
.audios .play_pause_btn {
    width: 40rpx;
    height: 44rpx;
    margin-right: 40rpx;
}
.play_pause_btn .btn{
    width: 100%;
    height: 100%;
}
.audios .play_process {
    flex: 1;
    display: flex;
    justify-content: space-between;
    align-items: center;
}

代码中所用到的setTimes方法

const setTimes = (value) => {
    let theTime = parseInt(value);//秒
    let theTime1 = 0;//分
    if(theTime > 60){
        theTime1 = parseInt(theTime / 60);
        theTime = parseInt(theTime % 60);
        if(theTime1 > 60) {  
            theTime1 = parseInt(theTime1 % 60);  
        }    
    }
    let theTime_y = parseInt(theTime);
    if(theTime_y < 10) {
        theTime_y = '0' + theTime_y   
    }
    let results = "" + theTime_y;
    if(theTime1 > 0 || theTime1 == 0) { 
        let theTime1_y = parseInt(theTime1);
        if(theTime1_y < 10){
            theTime1_y = '0' + theTime1_y;
        } 
        results = "" + theTime1_y + ":" + results;  
    }  
    return results;
}

嗯~,到这就写的差不多了,希望能够帮助大家,如若有地方不正确,还希望在评论区多多指出,或者私信小编哦,三克油😋

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值