使用帮助

视频缩略图雪碧图生成器 — 使用指南

为视频进度条生成悬停预览图(缩略图雪碧图)。从任意视频中提取帧,生成优化的雪碧图,并导出 ZWMAP 兼容的 JSON,实现与 ZWPlayer 的无缝集成。

快速入门

缩略图雪碧图生成器(又称"悬停预览图"或"进度条预览图"工具)是一款免费的在线工具,可以从视频中提取帧并将它们拼合为一张雪碧图。当用户将鼠标悬停在播放器进度条上时,即可看到对应时间点的预览画面——就像 B 站、腾讯视频、爱奇艺等主流平台那样的悬停预览效果。

快速上手步骤

  1. 加载视频

    将本地视频文件(MP4、WebM)拖拽到窗口中,或者在地址栏中粘贴远程视频 URL 并按回车键。

  2. 配置采样

    选择采样模式:固定间隔(例如每 5 秒)或指定帧数(例如均匀分布 100 帧)。调整帧尺寸和输出格式。

  3. 生成雪碧图

    点击"生成雪碧图"按钮(或按 G 键)。工具将提取帧并将它们组合成一张网格图像。

  4. 预览和导出

    使用 ZWPlayer 内置的缩略图预览功能预览结果(按 P 键)。下载雪碧图、导出 ZWMAP JSON,或同时获取两者的 ZIP 包。

提示:此工具完全在浏览器中使用 Canvas API 运行。视频数据不会上传到任何服务器——您的文件始终保持私密。

键盘快捷键

使用以下键盘快捷键提高工作效率:

按键 操作 说明
Space 播放 / 暂停 切换视频播放状态
, 逐帧后退 后退一帧
. 逐帧前进 前进一帧
后退 5 秒 向后跳转 5 秒
前进 5 秒 向前跳转 5 秒
G 生成 开始生成雪碧图
P 预览 使用 ZWPlayer 预览缩略图效果
Ctrl+S 下载雪碧图 保存生成的雪碧图文件
Esc 退出 退出预览模式或关闭放大查看

配置选项

采样模式

选项 取值 说明
固定间隔 ≥ 1 秒(无上限) 每隔 N 秒提取一帧。适用于场景变化均匀的视频。
指定帧数 1 – 3000 帧 在视频时长内均匀分布 N 帧。适用于需要统一预览密度的场景。

帧尺寸

参数 范围 默认值 说明
宽度 32 – 640 px 160 px 每帧的宽度,单位为像素。
高度 32 – 640 px 90 px 每帧的高度,单位为像素。默认为 16:9 宽高比。
宽高比锁定 按高度 / 按宽度 按高度 锁定宽高比,修改一个尺寸时自动调整另一个。

网格布局

参数 说明
列数 每行的帧数。留空则根据帧数和尺寸自动计算。
行数 雪碧图的总行数。留空则自动计算。

自动网格公式:col = ⌈√(totalFrames × (width / height))⌉,row = ⌈totalFrames / col⌉。此公式生成近似正方形的雪碧图,优化加载性能。

输出设置

参数 说明
格式 JPG(默认)— 文件更小,支持质量调节。PNG — 无损压缩,文件较大,支持透明。
质量 JPG 压缩质量,范围 1–100。默认:85。较低的值会减小文件大小,但降低图像清晰度。

输出格式

生成雪碧图后,您可以下载以下三种格式的结果:

1. 雪碧图

一张包含所有提取帧的网格图像文件(thumbnail.jpg 或 .png)。这是用于视频播放器在进度条上显示缩略图预览的主要输出。

2. ZWMAP JSON

遵循 ZWMAP/1.0 协议的 JSON 文件({title}_thumbnail.json)。包含缩略图 URL、帧尺寸、网格布局和总帧数。用于服务端配置和 CMS 集成。

JSON 面板可直接编辑或粘贴配置,点击"应用"将宽/高/列数与输出格式回写到配置表单;"重置"恢复最近应用的内容。total 字段由已截取帧数派生,无法从文本应用。

3. ZIP 打包

包含缩略图和 ZWMAP JSON 文件的 ZIP 压缩包({title}.zip)。方便一次性下载和部署。

ZWMAP 缩略图协议规范

ZWMAP(Z&W 媒体标注协议)缩略图类型定义了描述视频缩略图雪碧图的标准 JSON 格式。该协议实现了缩略图生成工具与视频播放器之间的互操作性。

协议头部

每个 ZWMAP 缩略图文档以协议标识符开头:

{
  "zwp_protocol": "ZWMAP/1.0",
  "zwp_type": "thumbnail",
  "zwp_version": "1.0"
}

缩略图对象字段

字段 类型 必填 说明
url string 雪碧图文件访问地址(JPG 或 PNG)。
width number 单帧宽度,单位为像素。用于计算 background-position 偏移。
height number 单帧高度,单位为像素。
col number 列数(每行帧数)。用于计算水平偏移。
row number 雪碧图行数。最后一行可能不满。
total number 雪碧图中的有效帧总数。

完整示例

{
  "zwp_protocol": "ZWMAP/1.0",
  "zwp_type": "thumbnail",
  "zwp_version": "1.0",
  "thumbnail": {
    "url": "https://cdn.example.com/thumbnails/thumbnail.jpg",
    "width": 160,
    "height": 90,
    "col": 10,
    "row": 10,
    "total": 100
  }
}

此示例描述了一个 10×10 的雪碧图,包含 100 帧,每帧 160×90 像素。当用户悬停在视频进度条上时,播放器根据悬停位置相对于总时长的比例来计算显示哪一帧。

注意:ZWMAP 缩略图协议不支持向后兼容。所有字段均为必填。没有探测规则——协议头部必须存在。

ZWPlayer 集成

ZWPlayer 是一个功能丰富的 JavaScript 视频播放器,开箱即用支持缩略图预览。以下是如何将生成的雪碧图与 ZWPlayer 集成。

播放器配置

在 ZWPlayer 初始化配置中添加 thumbnails 属性:

var player = new ZWPlayer({
  playerElm: 'mse',
  url: 'https://cdn.example.com/video.mp4',
  thumbnails: {
    url: 'https://cdn.example.com/thumbnails/thumbnail.jpg',
    width: 160,
    height: 90,
    row: 10,      // rowsize = ZWMAP's "col" value
    total: 100
  }
});

重要提示:ZWPlayer 使用 row 作为"rowsize"(每行帧数),对应 ZWMAP 协议的 col 字段。复制导出的 JSON 时,映射关系为:ZWMAP col → ZWPlayer row。

从工具复制配置

生成完成后,JSON 面板中提供了可直接使用的 ZWPlayer 配置片段。点击复制按钮即可直接复制。

实时预览

按 P 键或点击预览按钮,打开一个完整的 ZWPlayer 实例并加载生成的雪碧图。将鼠标悬停在进度条上即可看到缩略图预览效果。按 Esc 键退出。

使用 ZWMAP JSON

如果将缩略图存储在服务器上,将 ZWMAP JSON 文件放在已知 URL。您的应用可以获取该 JSON 并将解析后的 thumbnail 对象直接传递给 ZWPlayer 配置(注意 col → row 映射)。

使用 JSON URL

除了传入对象,还可以直接将 ZWMAP JSON 文件的 URL 作为字符串传入,ZWPlayer 会自动获取并解析:

var player = new ZWPlayer({
  playerElm: 'mse',
  url: 'https://cdn.example.com/video.mp4',
  thumbnails: 'https://cdn.example.com/thumbnails/movie_thumbnail.json'
});

部署方式:将导出的 ZWMAP JSON 文件下载并上传到 Web 服务器。JSON 中引用的雪碧图文件也需要一并上传到同一服务器。为方便起见,可以直接下载 ZIP 打包文件,解压后一起上传即可——JSON 与雪碧图之间的相对路径会自动生效。

拖拽加载

您还可以通过将文件直接拖拽到 ZWPlayer 播放器上来加载缩略图:

  • 单独拖拽缩略图 JSON:将 *_thumbnail.json 文件拖入播放器,为当前播放的视频加载缩略图。
  • 同时拖拽视频和缩略图:将视频文件与对应的缩略图 JSON 及雪碧图一起拖入,播放器会自动按文件名匹配(例如 movie.mp4 匹配 movie_thumbnail.json)。
  • 播放列表拖拽:拖入多个视频及对应的缩略图文件,自动创建带缩略图预览的播放列表。

注意:当 JSON 中的 url 字段为相对路径(如 thumbnail.jpg)时,需同时拖入对应的图片文件,播放器会自动解析并使用本地图片。

常见问题

什么是视频悬停预览图(缩略图雪碧图)?
悬停预览图(又称缩略图雪碧图)是一张包含多个视频帧的网格图像。视频播放器使用它在用户悬停进度条时显示对应的预览画面。播放器只需加载一张雪碧图,通过 CSS background-position 即可定位每帧,而无需请求数百张单独的图片。B 站、腾讯视频、爱奇艺、YouTube 等主流平台均采用此技术。
支持哪些视频格式?
工具支持浏览器原生可播放的任何视频格式。本地文件通常包括 MP4(H.264)、WebM(VP8/VP9)和 OGG(Theora)。远程 URL 同样支持这些格式,但 CORS 头必须允许跨域访问才能提取帧。如果遇到 CORS 错误,请先下载视频再作为本地文件加载。
应该提取多少帧?
取决于视频时长和所需的预览密度。对于大多数视频,100 帧(默认值)可提供良好的覆盖。对于较长的视频(超过 30 分钟),建议使用固定间隔模式,间隔 5–10 秒。帧数越多,雪碧图文件越大。以 B 站为例,通常使用 160×90 像素帧、100 帧左右的配置,文件大小控制在 500KB 以内。
为什么会出现 CORS 错误?
CORS(跨域资源共享)错误发生在加载远程视频时,服务器未包含适当的 Access-Control-Allow-Origin 头。出于安全原因,浏览器阻止从跨域资源进行基于 Canvas 的帧提取。解决方法是先下载视频,然后作为本地文件加载。
如何在自己的视频播放器中使用雪碧图?
雪碧图适用于任何支持通过 background-position 实现缩略图预览的视频播放器。关键参数为:帧宽度、帧高度、每行列数和总帧数。显示第 N 帧:计算 col = N % columns,row = floor(N / columns),然后设置 background-position: -(col × width)px -(row × height)px。ZWMAP JSON 导出包含所有这些参数的标准格式。
最大雪碧图尺寸是多少?
工具最多支持 3,000 帧,帧尺寸最大 640×640 像素。实际最大雪碧图尺寸取决于浏览器的 Canvas 限制——大多数现代浏览器支持最大 16,384 × 16,384 像素的画布。对于非常大的雪碧图,建议减小帧尺寸或帧数。
为什么悬停预览的画面有时与悬停时间略有偏差?
ZWMAP 缩略图协议假定帧均匀分布:播放器用总时长除以总帧数来选择显示哪一帧。固定间隔模式下实际帧时间是间隔的整数倍,当视频时长不是间隔的整数倍时,悬停预览最多偏差一个间隔。这是协议的固有行为;如需精确对齐,可减小间隔或改用指定帧数模式(帧严格均匀分布)。