uni-app nvue文件中,使用video全屏模式并设置loop="true",同时使用createInnerAudioContext添加背景音乐时,每当视频新loop开始时,audio会触发pause事件
uni-app nvue文件中,使用video全屏模式并设置loop=“true”,同时使用createInnerAudioContext添加背景音乐时,每当视频新loop开始时,audio会触发pause事件
信息类别 | 详细信息 |
---|---|
产品分类 | uniapp/App |
PC开发环境 | Windows |
PC版本号 | 10 |
HBuilderX | 正式 |
HBuilderX版本号 | 3.96 |
手机系统 | Android |
手机系统版本号 | Android 9.0 |
手机厂商 | 小米 |
手机机型 | 6x |
页面类型 | vue |
vue版本 | vue2 |
打包方式 | 云端 |
项目创建方式 | HBuilderX |
操作步骤:
如题
预期结果:
audio正常播放,不受影响
实际结果:
app端会触发pause事件
bug描述:
nvue文件中,使用video全屏模式,loop=“true”, 再使用createInnerAudioContext添加背景音乐,每当视频新loop开始时,audio会触发pause事件
1 回复
在 uni-app
的 nvue
文件中,使用 video
组件并设置 loop="true"
时,每当视频重新开始循环播放时,可能会触发 createInnerAudioContext
创建的背景音乐的 pause
事件。这是因为视频的循环播放可能会影响到音频的播放状态。
要解决这个问题,你可以尝试以下几种方法:
1. 监听视频的 ended
事件
你可以监听视频的 ended
事件,在视频播放结束时手动重新播放背景音乐。
<template>
<view>
<video id="myVideo" src="your-video-url" loop="true" @ended="onVideoEnded"></video>
</view>
</template>
<script>
export default {
data() {
return {
audioContext: null
};
},
mounted() {
this.audioContext = uni.createInnerAudioContext();
this.audioContext.src = 'your-audio-url';
this.audioContext.loop = true;
this.audioContext.play();
},
methods: {
onVideoEnded() {
// 视频结束时重新播放背景音乐
this.audioContext.play();
}
},
beforeDestroy() {
if (this.audioContext) {
this.audioContext.destroy();
}
}
};
</script>
2. 使用 seek
方法
在视频循环时,使用 seek
方法将视频的播放位置重置到开始,而不是让视频自然结束。这样可以避免触发 pause
事件。
<template>
<view>
<video id="myVideo" src="your-video-url" loop="true" @timeupdate="onTimeUpdate"></video>
</view>
</template>
<script>
export default {
data() {
return {
audioContext: null,
videoDuration: 0
};
},
mounted() {
this.audioContext = uni.createInnerAudioContext();
this.audioContext.src = 'your-audio-url';
this.audioContext.loop = true;
this.audioContext.play();
const videoContext = uni.createVideoContext('myVideo', this);
videoContext.onCanplay(() => {
this.videoDuration = videoContext.duration;
});
},
methods: {
onTimeUpdate(event) {
const currentTime = event.detail.currentTime;
if (currentTime >= this.videoDuration - 0.1) {
// 在视频即将结束时,将播放位置重置到开始
const videoContext = uni.createVideoContext('myVideo', this);
videoContext.seek(0);
}
}
},
beforeDestroy() {
if (this.audioContext) {
this.audioContext.destroy();
}
}
};
</script>
3. 使用 onPlay
事件
你可以在视频的 onPlay
事件中检查背景音乐是否被暂停,如果是,则重新播放背景音乐。
<template>
<view>
<video id="myVideo" src="your-video-url" loop="true" @play="onVideoPlay"></video>
</view>
</template>
<script>
export default {
data() {
return {
audioContext: null
};
},
mounted() {
this.audioContext = uni.createInnerAudioContext();
this.audioContext.src = 'your-audio-url';
this.audioContext.loop = true;
this.audioContext.play();
},
methods: {
onVideoPlay() {
if (this.audioContext.paused) {
this.audioContext.play();
}
}
},
beforeDestroy() {
if (this.audioContext) {
this.audioContext.destroy();
}
}
};
</script>
4. 使用 onPause
事件
你可以在音频的 onPause
事件中检查是否需要重新播放音频。
<template>
<view>
<video id="myVideo" src="your-video-url" loop="true"></video>
</view>
</template>
<script>
export default {
data() {
return {
audioContext: null
};
},
mounted() {
this.audioContext = uni.createInnerAudioContext();
this.audioContext.src = 'your-audio-url';
this.audioContext.loop = true;
this.audioContext.play();
this.audioContext.onPause(() => {
// 在音频暂停时重新播放
this.audioContext.play();
});
},
beforeDestroy() {
if (this.audioContext) {
this.audioContext.destroy();
}
}
};
</script>