今天项目上涉及到了微信小程序播放音频功能,所以今天跟着一些教程做了个简单的播放器

1、实现思路

  刚开始想着有没有现成的组件可以直接用,找到了微信的媒体组件 audio,奈何看着 1.6.0版本开始,该组件不再维护。就百度了一下,还好有另一种方式,使用 InnerAudioContext 来实现音频播放

  

2、界面预览

  

点击播放,播放按钮改变为暂停,播放后展示进度条,可 拖动/点击 进度条实现进度控制,可设置倍速

没有UI设计,所以界面很丑,界面后续完善,功能实现就行啦

3、界面代码

WXML:

 1 <view class="item-con">
2 <block wx:for="{{audios}}" wx:index="idx" wx:item="item" wx:key="idx">
3 <view class="audio-item">
4 <view class="audio-info">
5 <text>{{index+1+"."+item.name}}</text>
6 <view wx:if="{{audioDisplay!=item.id||paused}}" class="audio-btn" bindtap="audioPlay" data-info="{{item}}">播放</view>
7 <view wx:else class="audio-btn btn-pause" bindtap="audioPause">暂停</view>
8 </view>
9 <view class="audio-control" wx:if="{{audioDisplay==item.id}}">
10 <!-- 时长 -->
11 <view class="audio-number">{{forNowTime?forNowTime:0}}s</view>
12 <slider class="audio-slider" activeColor="#5189FF" block-size="12" value="{{current}}" max="{{duration}}" step="0.01" bindchanging="audioChanging" bindchange="audioChange">
13 </slider>
14 <view class="audio-number">{{forAllTime?forAllTime:0}}s</view>
15 <!-- 倍速控制 -->
16 <view class="audio-number speed" bindtap="setSpeed">
17 x{{doubleSpeed}}
18 <view wx:if="{{doubleSpeedSet}}" class="speed-wa" catchtap="setSpeedClose"></view>
19 <view wx:if="{{doubleSpeedSet}}" class="double-speed">
20 <view class="speed-item" catchtap="setSpeedTo" data-num="0.5">x0.5</view>
21 <view class="speed-item" catchtap="setSpeedTo" data-num="1.0">x1.0</view>
22 <view class="speed-item" catchtap="setSpeedTo" data-num="1.5">x1.5</view>
23 <view class="speed-item" catchtap="setSpeedTo" data-num="2.0">x2.0</view>
24 </view>
25 </view>
26 </view>
27 </view>
28 </block>
29 </view>

JS

  1 // 创建音频播放实例
2 const myAudio = wx.createInnerAudioContext()
3
4 Page({
5 /**
6 * 页面的初始数据
7 */
8 data: {
9 audios: [{
10 id: 1,
11 name: "秒针",
12 src: "https://sharefs.ali.kugou.com/202202121104/0639f9c2315cbb939aff741be27860ff/KGTX/CLTX001/02c4d6fefd5d899081ba45f47be48adb.mp3"
13 },
14 {
15 id: 2,
16 name: "做酒",
17 src: "https://sharefs.ali.kugou.com/202202121113/38ab5022041cea53ccff0752d481f818/KGTX/CLTX001/8fa49a75490d252a624c3e1872a26261.mp3"
18 },
19 {
20 id: 3,
21 name: "好想抱住你",
22 src: "https://sharefs.ali.kugou.com/202202121104/7aa9c439b799ea26ace0fee414aa9c12/KGTX/CLTX001/43f9b75efe102a48ab20131dcaa2b557.mp3"
23 },
24 {
25 id: 4,
26 name: "红尘彼岸却无她",
27 src: "https://sharefs.ali.kugou.com/202202121113/59831d34060f1dfcd2a114e74879868a/KGTX/CLTX001/8a57fbfe87af1dbcac1e9115a2ff1a06.mp3"
28 },
29 ],
30 // 音频播放控制
31 audioDisplay: null, //当前播放的音频,用于显示播放时长进度条等
32 forNowTime: '0', //当前播放时间
33 forAllTime: '0', //总时长
34 duration: 0, //总时间 秒
35 current: 0, //slider当前进度
36 seek: false, //是否处于拖动状态
37 paused: true, //是否处于暂停状态
38 doubleSpeed: 1.0, //播放倍速 默认1.0
39 doubleSpeedSet: false //倍速设置小弹窗
40 },
41
42 /**
43 * 生命周期函数--监听页面加载
44 */
45 onLoad: function (options) {// 音频播放初始化
46 this.audioInit()
47 },
48
49  // 音频播放-初始化
50 audioInit() {
51 // 设置音频播放倍速,此处若不设置,页面上点击设置倍速就不会产生效果
52 myAudio.playbackRate = 1.0
53 // 播放监听
54 myAudio.onPlay(() => {
55 console.log('开始播放')
56 console.log(myAudio.playbackRate);
57 })
58 // 暂停监听
59 myAudio.onPause(() => {
60 console.log('停止播放')
61 })
62 // 监听音频进入可以播放状态的事件。但不保证后面可以流畅播放,必须要这个监听,不然播放时长更新监听不会生效,不能给进度条更新值
63 myAudio.onCanplay(() => {
64 myAudio.duration
65 })
66 // 播放时长更新监听
67 myAudio.onTimeUpdate(() => {
68 // 监听播放进度,更新页面播放时长和进度条进度
69 this.setData({
70 forNowTime: parseInt(myAudio.currentTime),
71 forAllTime: parseInt(myAudio.duration),
72 current: myAudio.currentTime,
73 duration: myAudio.duration
74 })
75 })
76 // 播放出错监听
77 myAudio.onError((res) => {
78 console.log(res.errMsg)
79 console.log(res.errCode)
80 })
81 },
82
83 // 开始播放
84 audioPlay(val) {
85 console.log("点击了播放按钮", val);
86 if (val) {
87 // 展示当前播放音频的进度条
88 this.setData({
89 audioDisplay: val.currentTarget.dataset.info.id
90 })
91 // 设置当前播放音频的路径
92 myAudio.src = val.currentTarget.dataset.info.src
93 }
94 // 将暂停状态赋值为false
95 this.setData({
96 paused: false,
97 })
98 // 播放
99 myAudio.play()
100 },
101
102 // 暂停播放
103 audioPause() {
104 // 将暂停状态赋值为true
105 this.setData({
106 paused: true,
107 })
108 // 暂停
109 myAudio.pause()
110 },
111
112 // 进度条改变
113 audioChanging(val) {
114 // 通过 seek 来更改当前播放实例的进度
115 myAudio.seek(val.detail.value)
116 // 界面显示滑动的时间同步改变
117 this.setData({
118 forNowTime: parseInt(val.detail.value)
119 })
120 },
121
122 // 进度条改变完成
123 audioChange(val) {
124 myAudio.seek(val.detail.value)
125 },
126
127 // 点击设置倍速,弹出小弹窗
128 setSpeed() {
129 this.setData({
130 doubleSpeedSet: true
131 })
132 },
133
134 // 设置倍速的具体值
135 setSpeedTo(val) {
136 // 需要转换为 Number ,否则不生效
137 myAudio.playbackRate = Number(val.currentTarget.dataset.num)
138 // 界面同步更改并关闭小弹窗
139 this.setData({
140 doubleSpeed: val.currentTarget.dataset.num,
141 doubleSpeedSet: false
142 })
143 },
144
145 // 小弹窗关闭
146 setSpeedClose() {
147 this.setData({
148 doubleSpeedSet: false
149 })
150 },
151
152 /**
153 * 生命周期函数--监听页面隐藏
154 */
155 onHide: function () {
156 // 暂停播放
157 this.audioPause()
158 },
159
160 /**
161 * 生命周期函数--监听页面卸载
162 */
163 onUnload: function () {
164 // 停止播放
165 this.audioPause()
166 myAudio.stop()
167 },
168 })

4、注意事项

4.1  在初始化的时候需要设置一下播放倍速,不然后面的播放倍速功能可能会不生效

4.2 初始化时,需要配置 InnerAudioContext.onCanplay(function callback) 监听,不然后续播放时长监听可能监听不到

4.3 播放时间和进度条

这里播放时长和进度条为什么不用两个变量来控制

因为获取到的音频长度和当前播放位置是小数形式的,我只想进度条用小数来控制,而播放时间想显示整数,所以用了4个变量,当然也有其他更好的方法,后续会改进

注:其他的暂时没想到了,记录一下自己第一次写博客

  

微信小程序音频播放 InnerAudioContext 的用法的更多相关文章

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

    先来个效果图韵下味: 需求: 音频的播放,暂停,中间按钮状态的变化,播放时实时更新播放进度: 前进15s,后退15s: 进度条拖动. 一开始想着这3个功能应该挺简单的.不就是播放,暂停,前进,后退么~ ...

  2. 微信小程序 - 音频播放(1.2版本和1.2版本之后)

    不多说了,直接贴code // 1.2版本以后便不在维护 wx.getBackgroundAudioManager({ success:function(res){ var status =res.s ...

  3. 微信小程序音频背景播放

    由于微信小程序官方将音频的样式固定死了,往往再工作中和UI设计师设计出来的样式不符,故一般都采用背景音频播放来实现自定义的UI样式的音频播放,即使用官网API提供的BackgroundAudioMan ...

  4. 微信小程序音乐播放

    最近在写一个艾美食艾音乐的微信小程序,其中有用到音乐播放的功能,基本播放切换功能已经实现,但是在反复切换歌曲.重新进入歌曲以及单曲循环.列表循环的测试过程中还是发生了bug,特此写一篇文章,捋一下思路 ...

  5. 微信小程序音乐播放器

    写在前面 1.入门几天小白的作品,希望为您有帮助,有好的意见或简易烦请赐教 2.微信小程序审核音乐类别已经下架,想要发布选题需慎重.附一个参考链接,感谢https://www.hishop.com.c ...

  6. 微信小程序视图层介绍及用法

    一. 视图层 WXML(WeiXin Markup Language)是框架设计的一套标签语言,结合基础组件.事件系统,可以构建出页面的结构. 1.1. 数据绑定 1.1.1. 普通写法 <vi ...

  7. 微信小程序音频长度获取的问题

    小程序推荐使用wx.createInnerAudioContext()创建的innerAudioContext,我们也通过这个接口创建音频.音频的长度可以通过属性获取: 但是,给innerAudioC ...

  8. 微信小程序音乐播放器组件

    wxml <image bindtap="click" src="{{isPlay?'/images/':'/images/'}}"/> JS Pa ...

  9. 微信小程序---音乐播放和控制

    1.效果图如下: 2.代码如下: //index.js //获取应用实例 var app = getApp() Page({ data: { motto: 'Hello World', userInf ...

随机推荐

  1. Ranger-Yarn插件安装

    Ranger-Yarn插件ranger-0.6.0-yarn-plugin安装到Yarn的所有ResourceManager节点, 其他的NodeManager节点不需要安装. 登陆hdfs安装的用户 ...

  2. PHP DateTime类常用方法总结

    实例化: $date = new DateTime(); $date = new DateTime('2018-01-01'); $date = new DateTime('tomorrow'); $ ...

  3. org.reflections 接口通过反射获取实现类源码研究

    org.reflections 接口通过反射获取实现类源码研究 版本 org.reflections reflections 0.9.12 Reflections通过扫描classpath,索引元数据 ...

  4. 基于windows环境VsCode的ESP32开发环境搭建

    1. 基于windows环境VsCode的ESP32开发环境搭建,网上有各类教程,但是我实测却不行. 例如我在vscode内安装的乐鑫插件,扩展配置项是下图这样: 而百度的各类博文却都是这样: 经过网 ...

  5. 三分钟:极速体验JAVA版目标检测(YOLO4)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  6. Solon 开发,四、Bean 扫描的三种方式

    Solon 开发 一.注入或手动获取配置 二.注入或手动获取Bean 三.构建一个Bean的三种方式 四.Bean 扫描的三种方式 五.切面与环绕拦截 六.提取Bean的函数进行定制开发 七.自定义注 ...

  7. winform GDI+ 抗锯齿

    graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

  8. 【刷题-LeetCode】154 Find Minimum in Rotated Sorted Array II

    Find Minimum in Rotated Sorted Array II Suppose an array sorted in ascending order is rotated at som ...

  9. JUC之阻塞队列(BlockingQueue)基础

    阻塞队列 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列.这两个附加的操作支持阻塞的插入和移除方法. 阻塞队列常用于生产者和消费者的场景: 当队列为空的,从队列中获取元素的操作将会 ...

  10. 公司内部一次关于kafka消息队列消费积压故障复盘分享

    背景现象 1.20晚上8点业务线开始切换LBS相关流量,在之后的1个小时时间内,积压量呈上升趋势,一路到达50W左右,第二天的图没贴出具体是50W数字,以下是第一天晚上的贴图部分. 现象一: 现象二: ...