小程序音频播放相关

javascript 复制代码
let innerAudioContext = null
let backgroundAudioManager  = null
let isPlay = false

page之上定义,不用随时setData会有延迟。注意:页面上用到的要在data里面写,不在页面上展示js直接用的可以在上面定义全局

判断是否支持基础库

javascript 复制代码
isCanUseBgAudio = wx.canIUse('getBackgroundAudioManager')

需要兼容不支持的基础库使用-createInnerAudioContext(不支持播放速度)

背景悬浮框直接使用- getBackgroundAudioManager(支持播放速度)

javascript 复制代码
<view class="slider">
   <slider bindchange="sliderChange" bindchanging="sliderChange" value="{{sliderValue}}" min="0" max="{{maxSliderValue}}" block-size="12"/>
</view>
 <span bind:tap="prePlay">上一段</span>
 <span bind:tap="palyAudio">{{textPlay}}</span>
 <span bind:tap="nextPlay">下一段</span>
javascript 复制代码
if (isCanUseBgAudio){
      innerAudioContext = wx.createInnerAudioContext({
        useWebAudioImplement: true
      })
      backgroundAudioManager = wx.getBackgroundAudioManager()
      backgroundAudioManager.onEnded(() => {
        console.log("音乐播放结束");
        if (this.data.currentIndex != (this.data.currentList.length -1)){
          this.nextPlay()
        } else {
          console.log('最后结束')
        }
      })

      backgroundAudioManager.onTimeUpdate(() => {
        if (backgroundAudioManager.paused) {
          return;
        }
        const duration = backgroundAudioManager.duration; // 音频总时长
        const currentTime = backgroundAudioManager.currentTime; // 当前播放时长
        const currentSecond = util.formatSeconds(backgroundAudioManager.currentTime)
        this.setData({
          sliderValue: currentTime,
          maxSliderValue: duration,
          currentSecond: currentSecond
        })
      })

      backgroundAudioManager.onPause(() => {
        isPlay = false
        this.setData({
          textPlay: '播放',
        })
      })
      backgroundAudioManager.onPlay(() => {
        isPlay = true
        this.setData({
          textPlay: '暂停',
        })
      })
      backgroundAudioManager.onNext(() => {
        // 监听用户在系统音乐播放面板点击下一曲事件
        this.nextPlay()
      })
      backgroundAudioManager.onPrev(() => {
        // 监听用户在系统音乐播放面板点击上一曲事件
        this.prePlay()
      })
 } else {
 	innerAudioContext = wx.createInnerAudioContext({
        // useWebAudioImplement: true
      })
      innerAudioContext.src = url
      console.log('2222', url)
      // this.playType(item, url)
      innerAudioContext.play() // 播放

      innerAudioContext.onError((ee) => {
        // 监听音频播放错误事件
        console.log('errr',ee)
      })

      innerAudioContext.onEnded(() => {
        console.log("音乐播放结束");
        if (this.data.currentIndex != (this.data.currentList.length -1)){
          this.nextPlay()
        } else {
          console.log('最后结束')
        }
      })

      innerAudioContext.onTimeUpdate(() => {
        if (innerAudioContext.paused) {
          return;
        }
        const duration = innerAudioContext.duration; // 音频总时长
        const currentTime = innerAudioContext.currentTime; // 当前播放时长
        const currentSecond = util.formatSeconds(innerAudioContext.currentTime)
        // console.log('duration---', duration, currentTime, currentSecond)
        // sliderValue = currentTime
        this.setData({
          sliderValue: currentTime,
          maxSliderValue: duration,
          currentSecond: currentSecond
        })
      })

      innerAudioContext.onPause(() => {
        isPlay = false
        this.setData({
          textPlay: '播放',
        })
      })
      innerAudioContext.onPlay(() => {
        isPlay = true
        this.setData({
          textPlay: '暂停',
        })
      })
 }

暂停播放

javascript 复制代码
palyAudio(){
    if(isPlay){
      isPlay = false
      if (isCanUseBgAudio) {
        backgroundAudioManager.pause()
      }
      
      innerAudioContext.pause()
      this.setData({
        textPlay: '播放'
      })
    } else {
      isPlay = true
      if (isCanUseBgAudio) {
        backgroundAudioManager.play()
      } else {
        innerAudioContext.play()
      }
      this.setData({
        textPlay: '暂停'
      })
    }
javascript 复制代码
playType(item, url){
    if(isCanUseBgAudio){
    //backgroundAudioManager给src附完值不需要play自动播放
      backgroundAudioManager.src = url 
      backgroundAudioManager.title = item.title
      backgroundAudioManager.coverImgUrl =  poster
    } else {
    // innerAudioContext附完值需要play播放,另没有title
      innerAudioContext.src = url
      // innerAudioContext.title = item.title
      innerAudioContext.play() 
      console.log('innerAudioContext', innerAudioContext)  
    }
  },

util.js里面的formatSeconds

javascript 复制代码
function formatSeconds (value) {
  var secondTime = parseInt(value)
  var minuteTime = 0
  var hourTime = 0
  if(secondTime < 10) {
    return `00:0${secondTime}`
  }
  if (secondTime < 60) {
    return `00:${secondTime}`
  }
  minuteTime = parseInt(secondTime / 60)
  secondTime = parseInt(secondTime % 60)
  if (minuteTime > 60) {
    hourTime = parseInt(minuteTime / 60)
    minuteTime = parseInt(minuteTime % 60)
  }
  var result = formatNumber(parseInt(secondTime))
  if (minuteTime > 0) {
    result = '' + formatNumber(parseInt(minuteTime)) + ':' + result
  }
  if (hourTime > 0) {
    result = '' + formatNumber(parseInt(hourTime)) + ':' + result
  }
  return result
}

另附加参考:https://blog.csdn.net/xingchen_xc/article/details/139067665

相关推荐
却道天凉_好个秋1 天前
音视频学习(九十五):FEC
学习·音视频·fec
Greg_Zhong1 天前
小程序中登出/切换/重置页面状态的使用
小程序
一字白首1 天前
微信小程序进阶实战:从 UI 组件库到全局状态管理全解DAY05
ui·微信小程序·小程序
愚公搬代码1 天前
【愚公系列】《剪映+DeepSeek+即梦:短视频制作》019-声音:让短视频更加动听(添加音乐、音效和录音)
音视频
wefly20171 天前
m3u8live.cn 在线M3U8播放器,免安装高效验流排错
前端·后端·python·音视频·前端开发工具
却道天凉_好个秋2 天前
音视频学习(九十四):NACK和RTX
音视频·nack·rtcp·rtx
土土哥V_araolin2 天前
双迪大健康新零售系统开发要点
小程序·个人开发·零售
NGBQ121382 天前
Adobe-Premiere-Pro-2026-26.0.2.2-m0nkrus 全解析:专业视频编辑软件深度指南
前端·adobe·音视频
芯跳加速2 天前
AI 视频自动化学习日记 · 第三天
人工智能·学习·ai·自动化·音视频
chushiyunen2 天前
python edge-tts实现tts文本转语音、音频
数据库·python·音视频