javascript - 在 Video.js 中使用多个缩略图 Sprite

标签 javascript html css thumbnails video.js

我正在尝试使用 Video.js Thumbnails将鼠标悬停在我的 Video.js 播放器轨迹栏上时显示搜索预览缩略图。我使用 ffmpeg 将视频中的缩略图提取到 Sprite 表中。每个 Sprite 表都包含一定数量的缩略图,当缩略图提取过程中缩略图被填满时,就会创建一个新的 Sprite 文件。

在我的视频播放器页面上,我使用 JavaScript 创建一个对象以加载到缩略图()函数中。如果我想要每五秒一次的缩略图,我的对象可能看起来像这样:

th_object = {
  0: {
     src: 'source001.jpg',
     style: {
       left: '-40px',
       width: '4800px',
       height: '45px',
       clip: 'rect(0, 80px, 45px, 0)'
     }
  },
  5: {
     style: {
       left: '-120px',
       clip: 'rect(0, 160px, 45px, 80px)'
     }
  },
  ... 
}

当需要更改 Sprite 源时(例如大约 60 秒的视频),我使用相同的对象:

  ...
  60: {
    src: 'source002.jpg',
    style: {
      left: '-40px',
      width: '4800px',
      height: '45px',
      clip: 'rect(0, 80px, 45px, 0)'
    }
  },
  ...

然后我调用视频播放器的缩略图()函数(此处称为“视频”):

video.thumbnails(th_object);

所以,它所做的是在我的页面中为缩略图创建一个占位符,加载源图像并对其进行偏移,裁剪 Sprite 中不需要显示的部分。但页面中只创建了一个占位符。例如,我的 HTML 的摘录可能如下所示:

<div class="vjs-thumbnail-holder" style="left: 157px;">
  <img src="/storage/source001.jpg" class="vjs-thumbnail" style="left: -680px; width: 4800px; height: 45px; clip: rect(0px 720px 45px 640px); visibility: visible;">
</div>

当我将鼠标移过进度条时,值会更新,我的源最终也会改变。我并不完全确定这两个图像都已加载到页面上,因为当我检查页面元素时,在任何给定时间都只有一个可见。

当我将鼠标悬停在应加载非第一个 Sprite 表作为缩略图源的位置时,源似乎被卡住了。因此,如果我将鼠标移回应加载第一个 Sprite 表的位置,则不会,并且视频中该点会显示错误的 Sprite 。

我的第一个想法是我的 Sprite 表源需要不同的 HTML 元素,但我是 Web 开发新手,因此以这种方式修改 Video.js 缩略图代码对我来说可能不可行。任何有关此的帮助将不胜感激。如果您对其他包含搜索预览缩略图显示的播放器有任何建议或更好的方法来实现此目的,我们也将不胜感激。

最佳答案

在使用缩略图代码一段时间后,我发现了一种获得我需要的结果的方法。更新缩略图的 img src 的代码部分如下所示:

  // apply updated styles to the thumbnail if necessary
  mouseTime = Math.floor(event.offsetX / progressControl.width() * duration);
  for (time in settings) {
    if (mouseTime > time) {
      active = Math.max(active, time);
    }
  }
  setting = settings[active];
  if (setting.src && img.src != setting.src) {
    img.src = setting.src;
  }
  if (setting.style && img.style != setting.style) {
    extend(img.style, setting.style);
  }

本质上,我需要根据当前 mouseTime 所需的源来检查当前的 img src。所以我添加了一个额外的检查,如下所示:

  var x = Math.floor(mouseTime / 300);
  x = x * 300;

  var sourceNeeded = settings[x];

  if (setting.src && (img.src != setting.src)) {

    img.src = setting.src;               
  }
  if (sourceNeeded.src && (img.src != sourceNeeded.src)) {               

    img.src = sourceNeeded.src;
  }
  if (setting.style && img.style != setting.style) {
    extend(img.style, setting.style);
  }

上面硬编码的 300 是因为我的 Sprite 表包含 300 秒的缩略图。 (请注意,在我原来的帖子的示例中,我使用了 60。)x 变量确定 th_object 中正确源位置的索引,如果它与当前的 img src 不匹配,我会更新它。这将允许根据需要从一个 img src 正确转换到另一个 img src。

希望这对将来遇到类似情况的人有所帮助。

关于javascript - 在 Video.js 中使用多个缩略图 Sprite ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18882356/

相关文章:

jquery - 如何使用 css 在 "range" slider 后面设置一个居中的标签

javascript - window[name] 相当于动态访问 const 和 let 声明

javascript - 在 highcharts 中读取上传的 csv 文件

javascript - 将省略号添加到最后可用的代码行

javascript - 如何在 Node.js 中处理媒体流?

javascript - 如何在 Angular2 中嵌入视频?

html - CSS 和显示 : inline-block

javascript - es6中如何写子组件(child components)?

html - Bootstrap 导航栏和菜单右侧的位置 Logo

c++ - Qt 如何从外部 Qt 样式表文件应用样式?