当前位置: 首页 > news >正文

微信小程序mp3音频播放组件,仅需传入url即可

// index.js
// packageChat/components/audio-player/index.js
Component({/*** 组件的属性列表*/properties: {/*** MP3 文件的 URL*/src: {type: String,value: '',observer(newVal, oldVal) {if (newVal !== oldVal && newVal) {// 如果 InnerAudioContext 已存在,先停止并销毁它以避免多个实例if (this.innerAudioContext) {this.innerAudioContext.stop()this.innerAudioContext.destroy()this.innerAudioContext = null}// 初始化音频并获取时长this.initializeAudio()}}}},/*** 组件的初始数据*/data: {playStatus: 0, // 0: 未播放, 1: 正在播放duration: 0, // 音频总时长(秒)remain: 0 // 剩余播放时间(秒)},/*** 组件生命周期*/lifetimes: {attached() {if (this.data.src) {this.initializeAudio()}},detached() {// 组件卸载时,停止并销毁 InnerAudioContextif (this.innerAudioContext) {this.innerAudioContext.stop()this.innerAudioContext.destroy()this.innerAudioContext = null}}},/*** 组件的方法列表*/methods: {/*** 播放按钮点击事件*/playBtn() {const { src, playStatus } = this.dataif (!src) {wx.showToast({title: '没有录音文件',icon: 'none'})return}// 如果 InnerAudioContext 尚未创建,初始化它if (!this.innerAudioContext) {this.initializeAudio()}// 如果当前正在播放,停止播放并重置状态if (playStatus === 1) {this.innerAudioContext.stop()this.setData({playStatus: 0,remain: this.data.duration})return}// 每次点击都重新开始播放this.innerAudioContext.src = srcthis.innerAudioContext.play()// 更新播放状态this.setData({playStatus: 1,remain: this.data.duration})},/*** 初始化 InnerAudioContext 并绑定事件*/initializeAudio() {this.innerAudioContext = wx.createInnerAudioContext()this.innerAudioContext.obeyMuteSwitch = falsethis.innerAudioContext.src = this.data.src// 监听音频能够播放时触发this.innerAudioContext.onCanplay(() => {console.log('音频可以播放')const totalDuration = Math.floor(this.innerAudioContext.duration)if (totalDuration > 0) {this.setData({duration: totalDuration,remain: totalDuration})} else {console.warn('无法获取音频时长')}})// 监听播放开始this.innerAudioContext.onPlay(() => {console.log('音频开始播放')})// 监听播放结束this.innerAudioContext.onEnded(() => {console.log('音频播放结束')this.setData({playStatus: 0,remain: this.data.duration})// 触发自定义事件(如果需要)this.triggerEvent('playComplete')})// 监听播放错误this.innerAudioContext.onError(err => {console.error('播放错误:', err)wx.showToast({title: '播放失败,请重试',icon: 'none'})this.setData({playStatus: 0,remain: this.data.duration})})// 监听播放进度更新this.innerAudioContext.onTimeUpdate(() => {const current = Math.floor(this.innerAudioContext.currentTime)const remain = Math.floor(this.innerAudioContext.duration) - currentthis.setData({remain: remain > 0 ? remain : 0})})}}
})
<view class="voice-msg" bindtap="playBtn"><imagesrc="{{ playStatus === 0 ? '/sendingaudio.png' : '/voice.gif' }}"mode="aspectFill"class="voice-icon"/><text class="voice-msg-text"> {{ playStatus === 1 ? (remain + "''") : (duration + "''") }} </text>
</view>
/* packageChat/components/audio-player/index.wxss */
.voice-msg {display: flex;align-items: center;min-width: 200rpx;padding: 0 20rpx;height: 60rpx;background-color: rgba(149, 236, 105, 0.72);border-radius: 10rpx;box-shadow:0 3rpx 6rpx rgba(0, 0, 0, 0.13);.voice-icon {transform: rotate(180deg);width: 22rpx;height: 32rpx;}.voice-msg-text {margin-left: 10rpx;color:#000000 !important;font-size:30rpx !important;}
}
http://www.lryc.cn/news/519941.html

相关文章:

  • Sql 创建用户
  • 数据结构:LinkedList与链表—面试题(三)
  • 【开发日记】Docker修改国内镜像源
  • Elasticsarch:使用全文搜索在 ES|QL 中进行过滤 - 8.17
  • 第432场周赛:跳过交替单元格的之字形遍历、机器人可以获得的最大金币数、图的最大边权的最小值、统计 K 次操作以内得到非递减子数组的数目
  • RK3399开发板Linux实时性改造
  • 青少年编程与数学 02-006 前端开发框架VUE 22课题、状态管理
  • Linux 内核中的 netif_start_queue 函数:启动网络接口发送队列的关键
  • 数据结构之顺序结构二叉树(超详解)
  • acwing_5722_十滴水
  • acwing-3194 最大的矩形
  • UnityDemo-TheBrave-制作笔记
  • 玩转 JMeter:Random Order Controller让测试“乱”出花样
  • VTK知识学习(33)-交互问题2
  • Centos9-SSH免密登录配置-修改22端口-关闭密码登录-提高安全性
  • SqlServer: An expression services limit has been reached异常处理
  • CentOS下安装Docker
  • WPF控件Grid的布局和C1FlexGrid的多选应用
  • Jenkins-持续集成、交付、构建、部署、测试
  • 高级第一次作业
  • Copula算法原理和R语言股市收益率相依性可视化分析
  • 反弹SHELL不回显带外正反向连接防火墙出入站文件下载
  • 后盾人JS--JS值类型使用
  • 1月11日
  • 【深度学习】Pytorch:加载自定义数据集
  • 最近在盘gitlab.0.先review了一下docker
  • OA项目登录
  • verilogHDL仿真详解
  • 基于http协议的天气爬虫
  • _STM32关于CPU超频的参考_HAL