html5、微信 无法快进、video currentTime 设定失效、重头开始播放。

视频快进难题解析
本文深入探讨了在不同浏览器及手机端微信上实现视频快进的挑战,包括关键帧概念、浏览器处理方式以及针对低性能播放器的解决方案。

本地资源无法快进

今天工作中根据需求要求将本地视频,快进到一定时间再播放。结果发现了一个坑

问题:

无法快进

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<video height="200" width="200" src="../file/aaa.mp4" id="video1" autoplay="autoplay" controls >
		</video>
		
		
	<script type="text/javascript">
				var video = document.getElementById('video1');
				video.currentTime = 100;
				video.play();
	</script>
	</body>
</html>

解决方案

百度搜索得知,谷歌浏览器中若想使这个属性有效,需要src使用网络路径,本地资源在谷歌浏览器上是无法快进的

必须使用类似这样的 http://www.scoure/try/sss/xx.mp4  url

手机端微信无法快进

在手机端上的时候,依旧出现了该问题。经查过大量baidu....,得出方案(都是前人的智慧)

如此设置

​
var video = document.getElementById('video');
var startTime= 20;
var b = true;
player.on('timeupdate',function(e){
	if(video.currentTime<startTime && b){
		//如果没有在播放状态一定要先播放再设置时间
		video.play();
		//转换成字符串再赋值,
		//部分浏览器必须这样做
		video.currentTime = startTime +'';

        b = false;
	}
});

​

​

手机端快进后回到进度跳到开始位置

发现在微信上如果对视频做出快进操作后,视频会莫名对从头播放(完全随机)。

通过学习 视频多媒体处理、查看资料……得出以下结论:

 

关键帧概念:

视频中对关键帧是有限的,理论上我们快进的话只可以跳转到关键帧,因为非关键帧是无法播放的。

播放器对于视频快进的处理方式:

高性能浏览器解决方式:

当我们在电脑端浏览器对视频快进的时候,如果目标时间点不是关键帧,浏览器会对该部分视频重新解码,将这一秒变成关键帧,再次编码。所以电脑端或者部分性能强悍的播放器是可以随便跳转的。

低性能浏览器解决方式:

播放器会自动跳转到该时间点最近到关键帧。但是如果该时间点与关键帧的播放时间过长,将会重头播放视频。(目前发现手机端的微信H5播放器就是这样的

对该情况的解决办法:

  1. 放弃低性能播放器的H5播放点跳转。
  2. 对源视频重新转码,并提高关键帧分布率。(本身码率就很低的视频,转码后效果依旧不理想
  3. 使用HlS格式的流媒体格式视频,并且控制TS切片数量。
在使用 UniApp 开发微信小程序时,要防止 video 组件快进,可以通过监听 `@timeupdate` 事件来实时获取视频播放时间,并在用户快进时将播放时间重置到之前的位置。以下是具体的实现步骤和示例代码: #### 1. 在 template 中添加 video 组件 ```vue <template> <view> <video id="myVideo" :src="videoSrc" @timeupdate="onTimeUpdate" @seeking="onSeeking" controls ></video> </view> </template> ``` #### 2. 在 script 中实现逻辑 ```vue <script> export default { data() { return { videoSrc: 'your-video-url', // 替换为实际的视频地址 lastValidTime: 0 // 记录上一次有效的播放时间 }; }, methods: { onTimeUpdate(e) { const currentTime = e.detail.currentTime; if (currentTime < this.lastValidTime) { // 如果检测到时间回退,可能是用户进行了快退操作,忽略 return; } this.lastValidTime = currentTime; }, onSeeking(e) { const videoContext = uni.createVideoContext('myVideo'); const currentTime = e.detail.currentTime; if (currentTime > this.lastValidTime) { // 如果检测到快进,将播放时间重置到上一次有效的时间 videoContext.seek(this.lastValidTime); } } } }; </script> ``` ### 代码解释 - `@timeupdate` 事件:在视频播放过程中,该事件会不断触发,用于实时获取当前的播放时间,并更新 `lastValidTime`。 - `@seeking` 事件:当用户开始拖动进度条进行快进或快退操作时触发。在该事件的处理函数中,检查当前时间是否大于 `lastValidTime`,如果是,则说明用户进行了快进操作,使用 `videoContext.seek` 方法将播放时间重置到 `lastValidTime`。 ### 注意事项 - 确保 `videoSrc` 是有效的视频地址。 - 该方法只能在用户拖动进度条时防止快进,对于一些特殊情况(如通过代码控制快进)可能无法完全阻止。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SUNbrightness

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值