小程序,uniapp,全局唯一audio控制播放,暂停
前言小程序的音频在整个小程序运行期,有很多页面有播放,或者暂停的,或者离开页面需要手动停止的需求。如果在单页面上创建一个createInnerAudioContext,audio对象,挺耗费资源的,一时又搜不到,没有直接能拿来用的。场景:页面1,八个音频实现播放,暂停,点击其他,再重头播放,退出页面后停止播放其他页面的播放暂停,退出后停止播放问题:audio对象 没有停止功能,官方给出的stop(
前言
小程序的音频在整个小程序运行期,有很多页面有播放,或者暂停的,或者离开页面需要手动停止的需求。如果在单页面上创建一个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
欢迎多多补充,多多点赞~
更多推荐
所有评论(0)