小程序音频播放相关

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

相关推荐
andrsted4 小时前
练题簿免费刷题小程序:和学习搭子共用一份题库,一起刷题复习
学习·面试·微信小程序·小程序·学习方法·刷题
hflmwl84 小时前
Wise Data Recovery找回误删的文档照片音乐和视频
音视频·datarecovery·找回误删的文档照片音乐和视频·找回误删的文档照片音乐视频
技灵AI4 小时前
AI 视频转场提示词怎么写?让前后画面衔接更自然
人工智能·prompt·aigc·音视频
万岳科技程序员小金6 小时前
教育机构如何搭建在线教学平台?网校系统、小程序与APP开发指南
小程序·在线教育系统源码·教育平台搭建·教育app开发·教育软件开发·教育小程序开发
youandyouyou6 小时前
跨区培训的屏幕共享怎么做才稳?同屏同步与弱网优化实践
音视频·网络通信
开开心心就好6 小时前
课堂随机点名工具,绿色版免安装双击即用
java·服务器·前端·ffmpeg·音视频·perl·symfony
美狐美颜SDK开放平台7 小时前
直播APP集成美颜SDK,如何梳理第三方组件的数据权限?
开发语言·人工智能·深度学习·音视频·第三方美颜sdk
小小王app小程序开发8 小时前
淘宝扭蛋机小程序玩法开发分析
小程序
l14372332678 小时前
批量视频硬字幕擦除多少钱?影响报价的关键因素全解析
音视频
2501_916008899 小时前
马甲包过审卡在哪?Ipa Guard 能做的和做不到的
android·小程序·https·uni-app·iphone·webview