加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 资源网站 > 资源 > 正文

微信小程序——音频播放器

发布时间:2020-12-14 19:12:28 所属栏目:资源 来源:网络整理
导读:先来个效果图韵下味: ? 需求: 音频的播放,暂停,中间按钮状态的变化,播放时实时更新播放进度; 前进15s,后退15s; 进度条拖动。 一开始想着这3个功能应该挺简单的。不就是播放,暂停,前进,后退么~呵~写的时候发现自己还是太年轻。当然,这跟自己的技

先来个效果图韵下味:

?

需求:

  1. 音频的播放,暂停,中间按钮状态的变化,播放时实时更新播放进度;
  2. 前进15s,后退15s;
  3. 进度条拖动。

一开始想着这3个功能应该挺简单的。不就是播放,暂停,前进,后退么~呵~写的时候发现自己还是太年轻。当然,这跟自己的技术功底有关系。现在把我遇到的难点及要注意的点说一下~

  1. 需要设置一个名为seekPosition的全局变量,初始值为0。我们要在播放的时候实时记录播放的位置,存到该变量里,这是方便在前进15s 或 后退15s 时计算时间点。
  2. 前进15s时要判断剩余时间是否>15s,如果<15s,则返回到开始位置;
  3. 后退15s时要判断播放时间是否>15s,如果<15s,则返回到开始位置;
  4. 点击播放时,要先判断seekPisition是否>0,如果>0,则跳转到seekPosition的位置,并播放;
  5. 拖动时,要先让音频停止播放,拖动结束后,再播放音频。并且要计算拖动位置对应的时间。

完整代码:

wxml:

复制代码

<view class=" audio-content">

  image src="{{logo640x360}}" class="bg-blur"></image>
  ="bg-gray"view="container-cover">
    ="cover">
      ="cover-image"="cover-tip">词不达意.mp3</>

    ="audio-inner row item-center"="audio-desc">{{currentProcess}}="audio-progress-wrap"van-slider value="{{sliderValue}}" step="{{sliderStep}}" active-color="#09bb07" use-button-slot bind:change="onSliderChange" bind:drag="onSliderDrag">
        ="slider-button" slot="button"van-slider>{{productDetail.duration}}<!-- 播放器控制条 -->
  section ="speech-player js_control_bar"="player-bar row  justify-center item-center"="backward js_audio_backward" title="后退15s"ss-icon name="back-15" size="32px" color="#fff" block="{{true}}" bind:click="backward" />
      ="play"="播放/暂停"="circle-loading" wx:if="{{loading}}"="play-outline"="50px"="{{pause}}"="audioPlay" />
        ="pause-outline"="{{playing}}"="audioPause" ="forward js_audio_forward"="前进15s"="forward-15"="forward" section>
>

复制代码

如果你要用的话把上面的 <ss-icon>?换成<van-icon>,并且需要自己找阿里矢量图标库查找对应的图标。

js:

,sliderStep:1 },0); line-height: 1.5 !important;">* * 组件的方法列表 */ methods: { 音频播放 audioPlay(e) { const _this = this; let audioDuration = _this.data.audioDuration; if (audioUrl) { if (seekPosition) { 如果有指定位置,则跳转到指定位置 audioContext.seek(seekPosition); } audioContext.play(); _this.setData({ pause: else { getJSON是我自己封装的 ss.getJSON('获取音频如果需要发送请求,这里面放请求地址',{ 放你自己的参数 },res => { audioUrl = res.t; audioContext.src = audioUrl; if (seekPosition) { audioContext.seek(seekPosition); } audioContext.play(); audioContext.onPlay(() => { console.log('onPlay') }) audioContext.onWaiting(() => { console.log('onWaiting') _this.setData({ pause: { console.log('onCanplay') _this.setData({ pause: false }) setTimeout(() => { audioContext.duration },500) _this.audioStatus(); }) audioContext.onError((res) => { console.log(res.errMsg) }) }) } },0); line-height: 1.5 !important;">播放暂停 audioPause: function() { const _this = this; audioContext.pause(); _this.setData({ pause: false }) },0); line-height: 1.5 !important;">记录播放状态 audioStatus: this; 音频播放进度更新事件 audioContext.onTimeUpdate(() => { seekPosition = audioContext.currentTime; _this.setData({ currentProcess: ss.formatSecToMin(audioContext.currentTime),sliderValue: audioContext.currentTime / _this.data.audioDuration * 100,}) }) 音频播放结束 audioContext.onEnded(() => { seekPosition = 0; _this.setData({ sliderValue: 0,pause: true }) }) },0); line-height: 1.5 !important;">开始拖动 onSliderDrag(e) { const _this = if (_this.data.playing) { _this.audioPause() } let sliderValue = e.detail.value; seekPosition = _this.data.audioDuration / 100 * sliderValue; _this.setData({ currentProcess: ss.formatSecToMin(seekPosition) }) },0); line-height: 1.5 !important;">拖动结束 onSliderChange(e) { const _this = this; _this.audioPlay() },0); line-height: 1.5 !important;">前进15s forward() { const _this = this,audioDuration = _this.data.audioDuration; let currentTime; if (_this.data.playing) { currentTime = audioContext.currentTime; } if (_this.data.pause) { currentTime = seekPosition; } if (audioDuration - currentTime > 15) { seekPosition = currentTime + 15; _this.setData({ sliderValue: seekPosition / audioDuration * 100,currentProcess: ss.formatSecToMin(seekPosition) }); } else { seekPosition = audioDuration; _this.setData({ sliderValue: 0,currentProcess: '00:00' }); } if (audioUrl && _this.data.playing) { audioContext.seek(seekPosition); } },0); line-height: 1.5 !important;">后退15s backward() { const _this = if (currentTime > 15) { seekPosition = currentTime - 15; } else { seekPosition = 0; } _this.setData({ sliderValue: seekPosition / audioDuration * 100,currentProcess: ss.formatSecToMin(seekPosition) }); if (audioUrl && _this.data.playing) { audioContext.seek(seekPosition); } } } })
大概就是这些了~有更好解决方案的欢迎留言哈~~

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读