uni-app动态切换video的src,视频黑屏不播放
uni-app动态切换video的src,视频黑屏不播放
操作步骤:
- 安卓7的系统,先给video标签的src一个初始的视频连接,可以正常播放,动态切换成另一个url直接黑屏了
预期结果:
- 正常播放新的视频链接
实际结果:
- 视频组件黑屏,不播放了
bug描述:
- 动态切换video标签的src,黑屏,不播放了
感谢反馈,这个你测试了多少设备,安卓模拟器是否正常,ios 设备是否正常,经过你测试和当前这台机器有关系,还是和安卓 7 有关系,还是都有问题,不是兼容性的关系?
测试了三台设备,一个安卓7的模拟器,两台安卓7的电视,都有这个问题,另外测了一台安卓9的电视和模拟器,安卓9没有发现这个问题,ios没有测试过
回复 1***@qq.com: 我使用你给的案例,在 Vue2+ HBuilderX alpha 最新版,测试安卓 14 没有复现黑屏的情况。怀疑是兼容问题,你尝试给 video 的父元素设置 v-if 切换一下试试,看是否可以绕过。我没有复现你的问题,所以不能进一步排查
回复 DCloud_UNI_OttoJi: 应该是只有安卓7以下的设备会有这种问题,另外我尝试过使用v-if去切换视频组件,但是会触发另一个问题,两个视频组件不断的销毁重建会使内存不断升高,最后导致应用崩溃卡死。参考:https://ask.dcloud.net.cn/question/198855
回复 1***@qq.com: 好,关联的帖子我转给相关同事了,细节在这个帖子里更新。现在有绕过方案吗,简单地通过停止播放再销毁是否可以缓解。如果是安卓 7 有问题,针对不同系统编写逻辑绕过是否解决了你的问题
在uni-app中动态切换<video>
组件的src
属性时,如果遇到视频黑屏不播放的问题,通常是因为视频组件的重新加载和渲染没有正确处理。以下是一个示例代码,展示如何在uni-app中动态切换<video>
组件的src
,并确保视频能够正常播放。
首先,确保你的页面或组件中有以下结构:
<template>
<view>
<button @click="changeVideo">切换视频</button>
<video
id="myVideo"
:src="videoSrc"
controls
autoplay
@loadedmetadata="onLoadedMetadata"
@error="onError"
></video>
</view>
</template>
<script>
export default {
data() {
return {
videoSrc: 'https://example.com/video1.mp4', // 初始视频URL
videoList: [
'https://example.com/video1.mp4',
'https://example.com/video2.mp4',
// 更多视频URL
],
currentIndex: 0,
};
},
methods: {
changeVideo() {
this.currentIndex = (this.currentIndex + 1) % this.videoList.length;
this.videoSrc = this.videoList[this.currentIndex];
this.reloadVideo();
},
reloadVideo() {
const videoElement = this.$refs.myVideo;
if (videoElement) {
// 暂停当前视频
videoElement.pause();
// 重置视频
videoElement.currentTime = 0;
// 强制重新加载视频
videoElement.load();
// 尝试自动播放(某些平台可能不支持autoplay)
videoElement.play().catch(err => {
console.error('视频自动播放失败:', err);
});
}
},
onLoadedMetadata() {
console.log('视频元数据加载完成');
},
onError(e) {
console.error('视频播放出错:', e.detail);
},
},
mounted() {
// 确保video组件有ref引用
this.$nextTick(() => {
this.$refs.myVideo = this.$el.querySelector('#myVideo');
});
},
};
</script>
在这个示例中,我们通过点击按钮来切换视频src
。切换后,调用reloadVideo
方法来处理视频的重新加载。关键步骤包括:
- 暂停当前播放的视频。
- 重置视频的当前时间到0。
- 调用
load
方法强制浏览器重新加载视频资源。 - 尝试调用
play
方法自动播放视频(注意,某些平台或浏览器可能不支持autoplay)。
注意,由于uni-app的跨平台特性,某些方法在特定平台上可能表现不一致。如果在某些平台上遇到自动播放问题,可以考虑使用用户交互(如点击按钮)来触发播放。