uni-app video组件timeupdate事件在华为鸿蒙系统中的bug
uni-app video组件timeupdate事件在华为鸿蒙系统中的bug
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| Windows | 24H2 | HBuilderX |
| Android |
示例代码:
<template>
<video class="video-view" id="myVideo" :loop="false" autoplay :controls="false"
:src="videoInfo.video.content" :poster="videoInfo.video.imgurl" :show-play-btn="false"
:show-center-play-btn="false" :enable-progress-gesture="false" @fullscreenchange="fullscreenchange"
@controlstoggle="controlstoggle" [@timeupdate](/user/timeupdate)="timeupdate"></video>
</template>
methods:{
timeupdate(e) {
// 模拟视频播放完毕
if (e.detail.currentTime >= this.videoInfo.video.duration - 1) {
this.simulationEnded(); // 模拟视频结束后触发的事件
return false;
}
}
}
操作步骤:
<template>
<video class="video-view" id="myVideo" :loop="false" autoplay :controls="false"
:src="videoInfo.video.content" :poster="videoInfo.video.imgurl" :show-play-btn="false"
:show-center-play-btn="false" :enable-progress-gesture="false" @fullscreenchange="fullscreenchange"
@controlstoggle="controlstoggle" [@timeupdate](/user/timeupdate)="timeupdate"></video>
</template>
methods:{
timeupdate(e) {
// 模拟视频播放完毕
if (e.detail.currentTime >= this.videoInfo.video.duration - 1) {
this.simulationEnded(); // 模拟视频结束后触发的事件
return false;
}
}
}
预期结果:
预期应该在视频66分32秒时,执行视频结束的方法,在视频结束的方法中,有停止视频的操作,视频进度应该停止在66分32秒
实际结果:
实际结果并未在66分32秒时,执行视频结束的方法,并且视频的进度会继续播放到66分33秒,并且视频界面出现loading状态。
bug描述:
uniapp开发app使用安心打包,nvue页面开发video时,@ended事件偶尔不触发,所以使用@timeupdate事件,模拟视频结束事件。本应在视频时长-1秒时,模拟视频结束,但是在鸿蒙3.0系统上,有些特定长度的视频,在视频长度-1秒的时候,并不会触发@timeupdate事件,并且变化到视频时长位置也不触发,导致无法模拟获取到视频结束的事件,无法执行下一步操作。暂时发现的视频时长为66:33(66分钟33秒)
更多关于uni-app video组件timeupdate事件在华为鸿蒙系统中的bug的实战教程也可以访问 https://www.itying.com/category-93-b0.html
测试过其它机型是正常的吗?只有在这个设备上才存在问题?
更多关于uni-app video组件timeupdate事件在华为鸿蒙系统中的bug的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
同一个视频,在其他设备上正常,甚至在鸿蒙4.2系统上都正常
奇怪的是,在这台鸿蒙3.0系统的华为设备上,也不是所有的视频都会出现这个情况,这是在使用的过程中发现了有这么一个视频出现了这种情况。
回复 7***@qq.com: 你可以先拿视频工具 FFmpeg 看一下这个视频有什么问题
回复 DCloud_UNI_yuhe: 如果是视频问题,那其他设备也会不正常,但是在其他设备上使用是正常的
这是一个已知的鸿蒙系统兼容性问题。在鸿蒙系统上,video组件的timeupdate事件触发机制存在异常,特别是在处理长视频时更为明显。
问题分析:
- timeupdate事件在鸿蒙系统上触发频率不稳定,可能在特定时间点(如66分32秒)漏触发
- 视频进度跳变时,timeupdate事件可能无法正确捕获
- 系统对长视频的处理存在兼容性问题
建议解决方案:
- 使用双保险机制:同时监听timeupdate和ended事件
timeupdate(e) {
const currentTime = e.detail.currentTime;
const duration = this.videoInfo.video.duration;
// 增加容错范围,避免因事件漏触发导致的问题
if (currentTime >= duration - 2 || currentTime >= duration * 0.99) {
this.simulationEnded();
}
}
- 添加定时器检测:
data() {
return {
videoContext: null,
checkInterval: null
}
},
mounted() {
this.videoContext = uni.createVideoContext('myVideo');
this.checkInterval = setInterval(() => {
if (this.videoContext) {
this.videoContext.getCurrentTime().then(time => {
if (time >= this.videoInfo.video.duration - 1) {
this.simulationEnded();
}
});
}
}, 1000);
},
beforeDestroy() {
if (this.checkInterval) {
clearInterval(this.checkInterval);
}
}

