video标签播放视频,精确控制在某个时间点暂停

监听timeupdate方法,得到的时间值是个有点类似随机数的一个值。
比如我想在60.33s这个精确点时间点来实现视频的暂停,使用timeupdate方法就无法实现这个功能
只能判断当前的时间是否大于60.33,这个时候实际上视频的播放进度已经超过了60.33这个时间点。
如何才能做到在精确的时间点上暂停呢?

我是想做到视频从0开始播放,当播放到60.33s时出现暂停,这个时间既不会提前也不会延后。

阅读 14.3k
4 个回答

要在60.33处暂停,在timeupdate中监听时间大于59.33(60.33-1),然后算出当前时间和目标时间的差值。再使用定时器函数来执行暂停,时间间隔就是刚才算出来的差值

很精确到是做不到的。
我是这么实现的,额外定义一个变量,在超过这个时间点后,判断是否暂停(预览弹窗等需求),暂停(预览)过,则继续播放。
小于这个时间点则设置为,未暂停(未预览)状态。
比如我有三条数据,time代表要暂停的时间点,hasView代表是否看过。

let list = [
    {time: 10, hasView: false},
    {time: 20, hasView: false},
    {time: 30, hasView: false},
]

核心代码

video.addEventListener('timeupdate', () => {
  list.forEach(e => {
    if (e.hasView && video.currentTime < e.time) {
      e.hasView = false
    }
    if (!e.hasView && video.currentTime >= e.time && myVid.currentTime < e.time + 0.5) { // 误差控制在0.5s内
      e.hasView = true
      myVid.pause()
    }
})
  1. 除非这个时间点是一个帧时间点,否则不会有这么准确的
  2. 线视频播放中的时间点信息是一种metadata数据,它其实是一个key值,这个点可以用来定位文件数据(对应帧——一般是关键帧数据头部的文件内偏移,而不是随机数)。
  3. 确实你只能通过比较来进行判断以及停止,不过判断点你不一定非要在60.33,你需要根据视频的帧率计算出对应的准确时间,然后提前1帧作为标准点来进行比较。
video.currentTime = 60.33;
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题