在Video.js缩略图中使用多个缩略图精灵

时间:2013-09-18 21:06:23

标签: javascript html css thumbnails video.js

当我将鼠标悬停在我的Video.js播放器曲目栏上时,我正在尝试使用Video.js Thumbnails来显示搜索预览缩略图。我已经使用ffmpeg从我的视频中提取了缩略图以使用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)'
     }
  },
  ... 
}

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

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

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

video.thumbnails(th_object);

所以,这样做是在我的页面中为缩略图创建占位符并加载源图像并对其进行偏移,裁剪不需要显示的精灵部分。但是页面中只创建了一个占位符。例如,我的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>

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

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

我的第一个想法是我的精灵表源需要不同的HTML元素,但我不熟悉Web开发,因此以这种方式修改Video.js缩略图代码可能对我不适用。任何有关这方面的帮助将不胜感激。如果您对其他包含搜索预览缩略图显示或更好的方法来实现此功能的玩家有任何建议,那么我们将非常感激。

1 个答案:

答案 0 :(得分:1)

使用缩略图代码后,我发现了一种获得所需结果的方法。更新缩略图的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来自于我的精灵表包含300秒的缩略图。 (请注意,在我的原始帖子的示例中,我使用了60.)x变量确定th_object中的索引以获取正确的源位置,如果这与当前的img src不匹配,我会更新它。这将允许根据需要从一个img src正确转换到另一个img src。

希望这将有助于将来处于类似情况的人。