微信原生小程序实现音乐播放进度条

本文介绍如何使用HTML5的audio和progress标签创建音乐播放器及进度条,通过拖动进度条实时更新播放进度,详细解析了代码实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

audio标签、progress标签实现音乐播放进度条

HTML5 audio标签、progress标签实现音乐播放及进度条,通过拖动进度条更新播放进度。本次分享以功能实现为主,样式先不考究,见谅。

HTML

  <view class="audio-play">
    <audio src=""></audio>
  </view>
  
  <view>
    <view class="one-column play-it" bindtap="playMusic">
      <view>点击播放</view>
    </view>
    
    <progress class="music-prog" bindtouchmove="setTouchMove" percent="{{musicPercent}}"></progress>
    
    <view class="percent-num">{{musicPercent}}%</view>
  </view>
  1. audio 标签必须写进HTML,只要不设置controls="true"就不会展示出来;
  2. bindtouchmove表示触摸事件;
  3. progress标签通过percent属性设置进度

CSS

.play-it{
  margin-left: 300rpx;
}

.music-prog{
  width: 550rpx;
  height: 10rpx;
  margin: 50rpx 100rpx;
  color: #0099ff;
  background-color: #999;
}

.percent-num{
  margin: -20rpx 0 0 100rpx;
  font-size: 28rpx;
}

JS

  onShow() {
    // 监听音乐播放
    let that = this
    wx.onBackgroundAudioPlay(() => {
      that.timer && clearInterval(that.timer)
      that.timer = setInterval(() => {
        wx.getBackgroundAudioPlayerState({
          success: res => {
            let per = (res.currentPosition/res.duration)*10000
            that.setData({
              musicPercent: Math.round(per)/100 + '',
              duration: res.duration
            })
          }
        })
      }, 1000)
    })

    // 监听背景音频暂停事件
    wx.onBackgroundAudioPause(() => {
      clearInterval(that.timer)
    })

    // 监听背景音频停止事件
    wx.onBackgroundAudioStop(() => {
      clearInterval(that.timer)
    })
  },
  
  playMusic() {
 	 let obj = {
       dataUrl: 'http://p6jceeddp.bkt.clouddn.com/%E5%B0%A4%E9%95%BF%E9%9D%96%20-%20%E6%98%A8%E6%97%A5%E9%9D%92%E7%A9%BA.mp3',
        title: '昨日青空',
        coverImgUrl: '/static/images/avatar.png'
      }
      wx.playBackgroundAudio(obj)
    },
 
  setTouchMove (e) {
    if(e.touches[0].clientY >= 390 && e.touches[0].clientY <= 410) {
      if (e.touches[0].clientX >= 55 && e.touches[0].clientX <= 355) {
        let percent = (e.touches[0].clientX - 55)/300*10000
        this.setData({
          musicPercent: Math.round(percent)/100 + ''
        })
        this.data.current = (this.data.musicPercent/100)*this.data.duration
      }
    }
  },
  
  setProgress() {
    let that = this
    console.log('bindtouchend')
    wx.getBackgroundAudioPlayerState({
      success: res => {
        that.data.current !== res.currentPosition &&
        wx.seekBackgroundAudio({
          position: that.data.current,
          success () {
            console.log('seek', that.data.current)
          }
        })
      }
    })
  }

确定进度条的有效区域

横向: e.touches[0].clientX
纵向: e.touches[0].clientY

此处横向为 55~355 ,纵向为 390~410

定义触摸事件

获取到的横向进度条位置,计算用户所拖拽到的进度条位置

**注意:在此处调用wx.seekBackgroundAudio()设置播放进度,会导致音频出现卡顿的效果。因为用户拖动的过程中会多次调用seek方法,所以应该把设置播放进度放在拖动进度条完成之后再执行。

touchend监听触摸事件的停止

根据触摸事件中计算得到的时间current,调用wx.seekBackgroundAudio()设置播放进度

在这里插入图片描述

<think>我们正在讨论微信小程序中的视频播放功能。用户询问的是官方组件API的实现方式。根据引用内容,微信小程序提供了<video>组件相关的API来控制视频播放。引用[1]提到视频组件<video>提供了丰富的功能,包括播放、暂停、停止、跳转、发送弹幕、调整播放速率等。引用[2]提到可以通过步骤自定义视频播放器的外观行为,并建议查看最新文档。引用[3]具体提到了实现倍速播放的API(VideoContext.playbackRate)以及一个示例链接。因此,回答应该围绕官方<video>组件的使用VideoContextAPI的控制展开。步骤:1.介绍<video>组件的基本用法,包括在wxml中的标签使用基本属性。2.介绍如何通过VideoContextAPI来控制视频,例如创建上下文,然后调用播放、暂停等方法。3.可以给出一个简单的示例代码,包括wxmljs部分。4.提到一些常用的属性方法,如src(视频源)、autoplay(自动播放)、controls(控制条)、playbackRate(倍速播放)等。5.根据引用[3],倍速播放的支持倍率有0.5,0.8,1.0,1.25,1.5。注意:回答要使用中文,并且按照用户要求,行内数学表达式用$...$,但这里没有数学表达式,所以主要关注代码文字描述。另外,生成相关问题。</think>### 微信小程序视频播放实现方式 微信小程序通过官方提供的 `<video>` 组件及其配套 API 实现视频播放功能,以下是具体实现方式: #### 1. **基础组件使用** 在 WXML 文件中直接使用 `<video>` 组件: ```html <video src="{{videoUrl}}" controls autoplay bindplay="onPlay" binderror="onError" ></video> ``` - **关键属性**: - `src`:视频资源地址(支持网络/本地路径) - `controls`:显示控制条 - `autoplay`:自动播放(需用户交互触发) - `danmu-list`:弹幕数据(需开启 `enable-danmu`) #### 2. **API 控制(VideoContext)** 通过 `wx.createVideoContext` 创建实例实现精细化控制: ```javascript Page({ data: { videoUrl: 'https://example.com/sample.mp4' }, onReady() { this.videoCtx = wx.createVideoContext('myVideo') // 需设置video组件的id }, // 控制方法示例 playVideo() { this.videoCtx.play() }, pauseVideo() { this.videoCtx.pause() }, seekTo(time) { this.videoCtx.seek(time) }, setSpeed(rate) { this.videoCtx.playbackRate(rate) } // 支持0.5/0.8/1.0/1.25/1.5倍速[^3] }) ``` #### 3. **核心功能实现** - **弹幕功能**: ```javascript this.videoCtx.sendDanmu({ text: 'Hello!', color: '#FF0000', time: 10 // 视频第10秒显示 }) ``` - **全屏控制**: ```javascript this.videoCtx.requestFullScreen() // 进入全屏 this.videoCtx.exitFullScreen() // 退出全屏 ``` - **事件监听**: - `bindtimeupdate`:播放进度更新 - `bindfullscreenchange`:全屏状态变化 #### 4. **注意事项** - **自动播放限制**:iOS 需用户手势触发,安卓可配置 `autoplay` 属性[^1] - **视频格式**:推荐使用 MP4/HLS 格式(.mp4, .m3u8) - **自定义样式**:通过 `style` 或 `class` 修改播放器外观[^2] > 官方文档参考:[VideoContext API](https://developers.weixin.qq.com/miniprogram/dev/api/media/video/VideoContext.html)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值