前言
小程序的音频在整个小程序运行期,有很多页面有播放,或者暂停的,或者离开页面需要手动停止的需求。如果在单页面上创建一个createInnerAudioContext,audio对象,挺耗费资源的,一时又搜不到,没有直接能拿来用的。
场景:页面1,八个音频实现播放,暂停,点击其他,再重头播放,
退出页面后停止播放
其他页面的播放暂停,退出后停止播放
问题:audio对象 没有停止功能,官方给出的stop(),只是重头开始重新播放。
如果在其他页面重新创建audio,导致上一个audio对象重叠播放
解决重叠播放,官方给出的建议是给audio命名,以供精确控制

代码:
放在我创建的 utils下的common.js 文件夹

const utils = {};
var audio = uni.createInnerAudioContext()
var isPause = false   //是否在暂停状态
var previousSrc = ''   //上一个音频的地址,如果和现在的播放地址一样就进入暂停

utils.playAudios = function (src, volume) {
	if(isPause){    //在暂停状态
		if(previousSrc == src){
			audio.play()
		}else{
			audio.stop()
			audio.src = src
			previousSrc = src
			audio.onCanplay(()=> {
				audio.play()
			})	
		}
	}else{ //不在暂停状态
		if(previousSrc == src){
			audio.pause()
			isPause = true
		}else{
			audio.stop()
			audio.src = src
			previousSrc = src
			audio.onCanplay(()=> {
				audio.play()
			})
		}
	}
}
utils.stopAudios = function () {
	audio.stop()
}
utils.pauseAudios = function () {
	audio.pause()
}

audio.onPlay(() => {  //播放监听事件
  console.log('开始播放');
   isPause = false
});
audio.onPause(() => {//暂停监听
  console.log('暂停');
  isPause = true
});

audio.onEnded(() => {// 自然播放结束监听也需要更改isPause 开关状态
  console.log('音频自然播放结束事件');
  isPause = true
});

export default utils

其他页面使用:

——————————————————————————————————————————————————script
	import utils from "../../utils/common.js"
	playVoice() {
				console.log('播放录音');
				if (this.personInfo.level1.voiceUrl) {
					utils.playAudios(this.personInfo.level1.voiceUrl)
				}
			},

然后令页面的 destroy生命函数,进行utils.pauseAudios(),不使用stop的原因是。停止其实是从头播放,所以只能用pause

以下为改进版

先说问题
1、播放时候进行连点,会造成判断失效,越短的音频连点越不会出现问题
2、播放完成时,如果没有重置播放状态,或者播放地址,或者判断是否时同一个音频会出现判断的直接失败
3、测试的时候发现播放地址后台给的全是一样的地址,此方法失效
4、如果为第一次播放,此法第二次判断完全失效
5、改成单组件的内部播放,全局播放起建议使用插件。离开当前vue,直接结束播放

//data数据存放方面
	data () {
      return {
        audio:new Audio(),
        isPause:false,
        previousId: '',  //此次播放音乐的id,解决上述得第3个问题,故取id
        
        timespmt:0,
      }
    },
//播放方法事件
	clickListen(item){ //为for循环 item为当前播放音乐得所有detail
        // 连点判断,解决上述的第1个问题
        var time = new Date().getTime();
        if (time - this.timespmt <= 500) return;
        this.timespmt = time

        let cilckId = item.id //之前取得是当前播放地址
        let url = item.productUrl
        let audio = this.audio
        if(!this.previousId){
          this.previousId = cilckId
          audio.src = url
          audio.play()
          console.log("第一次");
		  //只需要在第一次播放的时候添加监听回调
          audio.addEventListener('ended', function () {  
            this.isPause = false
            this.previousId = ''
            console.log("播放完成");
          }, false);
        }else{
          if(this.isPause){ //在暂停状态
            if(this.previousId == cilckId){ //是同一音乐就继续播
              audio.play()
              this.isPause = false
            }else{ //不是同一音乐重置暂停状态,然后播放
              this.isPause = false
              audio.src = url
              this.previousId = cilckId
              audio.play()
            }
          }else{ //不在暂停状态
            if(this.previousId == cilckId){ //如果是同一地址,就暂停,改变暂停状态
              audio.pause()
              this.isPause = true
            }else{   //不是同一地址,就赋值,播放新的
              audio.src = url
              this.previousId = cilckId
              audio.play()
              this.isPause = true461816314
            }
          }
        }
      },
      ————————————————————————————————————————————
      beforeDestroy(){
	    this.audio.pause()
	  },

帮到你的话,点个赞吧d=====( ̄▽ ̄*)b

————Lazy33

欢迎多多补充,多多点赞~

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐