You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在Video.js中重新定位进度条的开始与结束时间?

解决Video.js进度条重新定位起始时间的方案

我刚好处理过类似的需求,给你分享个基于Video.js最新版本的原生实现方案,完全能满足你说的:把当前播放位置设为新的进度条0点,视频还能继续播放。

核心思路

我们需要做的就是“调整”播放器的时间显示逻辑,把原视频时间转换成相对于自定义起始点的时间,同时确保进度条的交互(点击、拖动)能准确映射回正确的原视频时间。

具体实现步骤

1. 初始化播放器并定义变量

首先正常初始化你的Video.js播放器,然后定义一个变量来存储我们的自定义起始时间:

const player = videojs('my-video');
let customStartTime = 0; // 初始为0,对应原视频的起始点

2. 编写重置起始点的核心函数

这个函数负责更新起始时间、重写时间显示逻辑、处理进度条交互:

function setCustomStartTime(newStartTime) {
  // 先记录当前播放状态,避免设置后意外暂停
  const wasPlaying = !player.paused();
  
  // 保存新的起始时间
  customStartTime = newStartTime;
  // 计算自定义的总时长(原视频总时长 - 新起始时间)
  const customDuration = player.duration() - customStartTime;
  
  // 等播放器就绪后重写相关方法
  player.ready(() => {
    // 重写当前时间显示的更新逻辑
    player.currentTimeDisplay.update = function() {
      // 计算相对于新起始点的时间
      const relativeTime = player.currentTime() - customStartTime;
      this.el_.textContent = player.formatTime(relativeTime);
    };
    
    // 重写总时长显示的更新逻辑
    player.durationDisplay.update = function() {
      this.el_.textContent = player.formatTime(customDuration);
    };
    
    // 处理进度条点击事件:把点击位置映射回原视频时间
    player.controlBar.progressBar.on('click', function(e) {
      // 计算点击位置对应的相对时间
      const relativeSeekTime = (e.offsetX / this.el_.offsetWidth) * customDuration;
      // 设置原视频的对应时间
      player.currentTime(customStartTime + relativeSeekTime);
    });
    
    // 处理进度条拖动事件:限制拖动范围在自定义的时间区间内
    const originalMouseMove = player.controlBar.progressBar.seekBar.handleMouseMove;
    player.controlBar.progressBar.seekBar.handleMouseMove = function(e) {
      originalMouseMove.call(this, e);
      const currentRelativeTime = player.currentTime() - customStartTime;
      // 边界检查,避免拖动超出自定义的起始/结束点
      if (currentRelativeTime < 0) {
        player.currentTime(customStartTime);
      } else if (currentRelativeTime > customDuration) {
        player.currentTime(customStartTime + customDuration);
      }
    };
  });
  
  // 如果之前在播放,设置后继续播放
  if (wasPlaying) {
    player.play();
  }
  
  // 强制更新时间显示和进度条状态
  player.currentTimeDisplay.update();
  player.durationDisplay.update();
  player.controlBar.progressBar.update();
}

3. 触发重置操作

比如你要在播放到200秒时自动触发,就可以监听timeupdate事件:

player.on('timeupdate', function() {
  // 当播放到200秒且还没设置过自定义起始点时触发
  if (player.currentTime() >= 200 && customStartTime === 0) {
    setCustomStartTime(200);
    // 只触发一次,移除这个监听
    player.off('timeupdate', arguments.callee);
  }
});

额外说明

  • 如果你需要手动触发(比如加个按钮),直接调用setCustomStartTime(200)就行,不用监听timeupdate
  • 测试时要注意进度条的拖动边界,确保不会拖到原视频的200秒之前或者300秒之后。
  • 这个方案基于Video.js的原生API,不需要额外插件,适配最新版本没问题。

内容的提问来源于stack exchange,提问作者goltornate

火山引擎 最新活动