uni-app video播放器偶尔会出现卡在最后1s结束不掉
uni-app video播放器偶尔会出现卡在最后1s结束不掉
操作步骤:
- 正常播放视频,
预期结果:
- 希望能正常结束
实际结果:
- 卡在最后一秒结束不掉
bug描述:
video播放器偶尔会出现卡在最后1s结束不掉。每次点击播放就会播放最后1s。类似视频中展示那样。
信息类别 | 详细信息 |
---|---|
产品分类 | uniapp/App |
PC开发环境 | Windows |
PC系统版本号 | win10 |
HBuilderX类型 | 正式 |
HBuilderX版本 | 4.29 |
手机系统 | Android |
手机系统版本号 | Android 15 |
手机厂商 | 小米 |
手机机型 | Redmi K50 Ultra |
页面类型 | vue |
vue版本 | vue2 |
打包方式 | 云端 |
项目创建方式 | HBuilderX |
更多关于uni-app video播放器偶尔会出现卡在最后1s结束不掉的实战教程也可以访问 https://www.itying.com/category-93-b0.html
感谢反馈,你可以提供vue 版本和单页面的源码方便我测试。可以首先排除设备和视频源的问题,比如你使用官方提供的 demo 中的视频或者其他视频,观察是否可以正常暂停和停止,你反馈的是 红米手机有这个问题,其他安卓设备会这样吗?
提供更多信息,有助于定位和解答你的问题。
更多关于uni-app video播放器偶尔会出现卡在最后1s结束不掉的实战教程也可以访问 https://www.itying.com/category-93-b0.html
这是源码。
目前只发现红米是这样
回复 8***@qq.com: 我给你视频地址,你试一下官方的 视频是否会这样 https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/uni-app-video-courses.mp4
回复 DCloud_UNI_OttoJi: 这个视频源也会这样。
回复 DCloud_UNI_OttoJi: 我把代码清除,只保留播放器也会这样
回复 8***@qq.com: 经过我测试普通的 video 播放视频不会出问题,插件市场搜一搜其他播放器试试吧,看一下是 uniapp 的问题,还是个别真机的问题
回复 DCloud_UNI_OttoJi: 现在的问题是,我判断视频总时长前一秒我强制结束,并且把视频播放时长重置为0。第二次播放的时候,播放中事件中currentTime已经播放完了,但是页面显示的播放时间还远没有到达结束时间。
我下边放个图
播放完了,但是显示的当前播放时间不对
这个问题发现是stop方法的问题,改用pause在使用seek就可以了。
回复 8***@qq.com: 最初反馈的视频最后时间不准,也是因为业务代码导致的吗,目前还有问题吗
回复 DCloud_UNI_OttoJi: 不是。那个解决不掉,我只能用代码去强制再播放完成前一秒重置播放时间。还有这个stop方法也是有问题的。先stop再seek(0)。第二次播放的时候显示的播放时间就不准了。
在处理uni-app中video播放器偶尔卡在最后1秒无法结束的问题时,我们可以通过监听video组件的事件并结合一些逻辑来控制播放器的行为。以下是一个示例代码,展示了如何通过监听ended
事件和设置定时器来尝试解决这一问题。
首先,确保你的页面中有uni-app的video组件,并绑定相关事件:
<template>
<view>
<video
id="myVideo"
src="your-video-url.mp4"
controls
@ended="onVideoEnded"
ref="videoPlayer"
></video>
</view>
</template>
在脚本部分,我们可以定义onVideoEnded
方法以及一个用于处理定时器的函数:
<script>
export default {
data() {
return {
endTimer: null, // 用于存储定时器的变量
};
},
methods: {
onVideoEnded() {
// 当视频正常结束时触发此方法
console.log('Video ended normally.');
// 清除可能存在的定时器,防止重复设置
if (this.endTimer) {
clearTimeout(this.endTimer);
this.endTimer = null;
}
// 设置一个定时器,如果视频在1秒内没有真正结束(比如卡住了),则尝试手动重置播放器
this.endTimer = setTimeout(() => {
const videoPlayer = this.$refs.videoPlayer[0]; // 获取video组件的DOM对象
if (videoPlayer.currentTime === videoPlayer.duration) {
console.log('Video seems stuck, trying to reset...');
// 尝试重置播放器,这里可以根据具体需求调整,比如重新加载视频或者暂停后播放一小段再停止
videoPlayer.pause();
videoPlayer.currentTime = 0; // 重置播放时间到0
// 如果需要重新加载视频,可以使用以下方法,但注意这会导致视频从头开始播放
// videoPlayer.src = videoPlayer.src; // 重新设置视频源以触发重新加载
}
}, 1000); // 1秒后检查视频是否真正结束
},
},
onUnload() {
// 页面卸载时清除定时器,防止内存泄漏
if (this.endTimer) {
clearTimeout(this.endTimer);
this.endTimer = null;
}
},
};
</script>
在这个示例中,我们使用了@ended
事件来监听视频的自然结束。当视频结束时,我们设置了一个1秒的定时器。如果在这1秒内视频没有真正结束(即当前播放时间仍然等于视频总时长),我们尝试通过暂停视频并重置播放时间来解决问题。这种方法可能不是最优解,但可以作为临时解决方案,具体实现可能需要根据实际项目需求进行调整。