ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

微信小程序案例2.2:图片与声音——InnerAudioContext音频播放与变速控制详解

微信小程序案例2.2:图片与声音——InnerAudioContext音频播放与变速控制详解

一、案例概述

本案例演示了微信小程序中image组件的使用方法、InnerAudioContext音频上下文的创建与控制、数据绑定和事件绑定、onLoad生命周期函数等功能。实现效果:页面上显示一幅图片,点击图片时播放音乐,再次点击暂停播放,依次交替。功能扩展:增加了播放速度控制(慢速/正常/快速),并在每次播放和暂停时在控制台打印当前音频的播放位置和播放速率。

二、项目结构

miniprogram/ ├── app.js ├── app.json ├── app.wxss ├── sitemap.json ├── project.config.json └── pages/ └── index/ ├── index.js ├── index.json ├── index.wxml └── index.wxss

图片文件yanan.webp和音频文件huiyanan.mp3存放在微信云开发的云存储中,通过云存储下载链接(https URL)引用,页面中不再需要本地的images和audios目录。

二点五、云开发环境初始化

使用云存储资源前,需要在app.js中初始化云开发环境:

App({onLaunch(){wx.cloud.init({env:'cloud1-d6gbuj3063c9c4451'})}})

代码解析:

  • onLaunch是小程序启动时触发的生命周期函数,适合做云开发环境的初始化。

  • wx.cloud.init()初始化云开发能力,env参数指定云环境ID。

  • 初始化后,小程序就可以访问该环境下的云存储、云数据库、云函数等资源。

三、核心代码

3.1 index.wxml

<viewclass="container"><imagesrc="{{imgSrc}}"class="my-image"bind:tap="sing"></image><viewclass="status">{{isPlaying ? '播放中' : '已暂停'}}</view><viewclass="rate-box"><textclass="rate-label">播放速度:</text><buttonclass="rate-btn {{playbackRate === 0.5 ? 'active' : ''}}"bind:tap="setSlow">慢速</button><buttonclass="rate-btn {{playbackRate === 1 ? 'active' : ''}}"bind:tap="setNormal">正常</button><buttonclass="rate-btn {{playbackRate === 2 ? 'active' : ''}}"bind:tap="setFast">快速</button></view></view>

代码解析:

  • image组件的src属性通过数据绑定{{imgSrc}}指定图片路径。

  • bind:tap="sing"实现了事件绑定,点击图片后调用sing()函数。

  • 播放状态通过{{isPlaying ? '播放中' : '已暂停'}}三元表达式显示。

  • 三个按钮分别绑定setSlow、setNormal、setFast函数控制播放速度,通过class动态绑定高亮当前选中的速度。

3.2 index.js

Page({data:{imgSrc:'https://636c-cloud1-d6gbuj3063c9c4451-1508092649.tcb.qcloud.la/yanan.webp?sign=9e0e80b8cb5c775acee21e0d2a551edc&t=1792120820',isPlaying:false,playbackRate:1},onLoad(){this.audioCtx=wx.createInnerAudioContext();this.audioCtx.src='https://636c-cloud1-d6gbuj3063c9c4451-1508092649.tcb.qcloud.la/%E6%A1%88%E4%BE%8B2.2%E5%9B%BE%E7%89%87%E4%B8%8E%E5%A3%B0%E9%9F%B3/%E6%A1%88%E4%BE%8B2.2%20%E5%9B%BE%E7%89%87%E4%B8%8E%E5%A3%B0%E9%9F%B3/%E9%9F%B3%E9%A2%91%E8%B5%84%E6%BA%90/huiyanan.mp3?sign=e978d73e729c4e17d8ab218f042922a3&t=1792120798';this.audioCtx.playbackRate=1;this.audioCtx.onPlay(()=>{console.log('开始播放 - 当前位置:'+this.audioCtx.currentTime+',播放速率:'+this.audioCtx.playbackRate);});this.audioCtx.onPause(()=>{console.log('暂停播放 - 当前位置:'+this.audioCtx.currentTime+',播放速率:'+this.audioCtx.playbackRate);});},sing(){if(this.data.isPlaying){this.audioCtx.pause();this.setData({isPlaying:false});}else{this.audioCtx.play();this.setData({isPlaying:true});}},setSlow(){this.audioCtx.playbackRate=0.5;this.setData({playbackRate:0.5});},setNormal(){this.audioCtx.playbackRate=1;this.setData({playbackRate:1});},setFast(){this.audioCtx.playbackRate=2;this.setData({playbackRate:2});},onUnload(){if(this.audioCtx){this.audioCtx.destroy();}}});

代码解析:

  • onLoad是页面生命周期函数,页面加载时触发,只调用一次。在此函数中通过wx.createInnerAudioContext()创建音频上下文实例。

  • audioCtx.src设置音频文件的云存储下载链接,支持网络https地址。

  • audioCtx.playbackRate设置播放速率,1为正常速度,0.5为慢速,2为快速。

  • onPlay和onPause是音频事件的监听回调,在播放和暂停时通过console.log打印当前播放位置currentTime和播放速率playbackRate。

  • sing()函数通过判断isPlaying状态实现播放和暂停的交替。

  • onUnload中调用destroy()销毁音频实例,避免内存泄漏。

3.3 index.wxss

.container{display:flex;flex-direction:column;align-items:center;padding:40rpx;}.my-image{width:600rpx;height:400rpx;border-radius:20rpx;box-shadow:0 4rpx 20rpxrgba(0,0,0,0.15);}.status{margin-top:30rpx;font-size:30rpx;color:#333;}.rate-box{margin-top:40rpx;display:flex;flex-direction:row;align-items:center;}.rate-label{font-size:28rpx;color:#666;margin-right:10rpx;}.rate-btn{font-size:26rpx;padding:10rpx 30rpx;margin:0 10rpx;background-color:#f0f0f0;color:#333;border-radius:10rpx;line-height:1.5;}.rate-btn.active{background-color:#07c160;color:#fff;}

四、功能扩展说明

4.1 播放速度控制

通过InnerAudioContext的playbackRate属性实现:

按钮playbackRate值效果
慢速0.5半速播放
正常1正常速度
快速2两倍速播放

点击不同按钮时,设置audioCtx.playbackRate的值即可实时改变播放速度。

4.2 控制台打印播放位置和速率

在onPlay和onPause回调中,读取this.audioCtx.currentTime(当前播放位置,单位秒)和this.audioCtx.playbackRate(播放速率),通过console.log打印到控制台。

控制台输出示例:

开始播放 - 当前位置:0,播放速率:1 暂停播放 - 当前位置:3.5,播放速率:1 开始播放 - 当前位置:3.5,播放速率:2

五、关键技术点总结

  1. image组件:通过src属性指定图片路径,支持数据绑定,可以直接使用网络图片地址。
  2. 事件绑定:bind:tap绑定点击事件,点击后调用对应的处理函数。
  3. 云开发云存储:静态资源(图片、音频)上传到云存储后,通过下载链接引用,无需打包进小程序本地目录,节省小程序包体积。使用前需在app.js中调用wx.cloud.init()初始化云环境。
  4. InnerAudioContext:微信小程序提供的音频上下文API,用于创建和控制音频播放,src支持本地路径和网络https地址。
  5. playbackRate属性:控制音频播放速率,支持0.5(慢速)、1(正常)、2(快速)等值。
  6. currentTime属性:获取当前音频的播放位置(秒)。
  7. onLoad生命周期:页面加载时触发,适合做初始化工作。
  8. onPlay/onPause事件:监听音频播放和暂停事件,可以在回调中获取音频状态信息。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进