zwplayer 字幕使用说明
1. 概述
字幕用于录播文件的播放,显示视频声音轨道的文字内容。zwplayer 提供完整的字幕系统,支持同时呈现两路字幕(双字幕功能)、运行时样式自定义、全文检索与跳转、机器翻译以及按字幕区间的循环播放,为用户提供灵活且强大的字幕观看体验。
字幕显示示例
下图展示了 zwplayer 同时呈现双字幕的效果:

字幕控制示例
用户可以通过播放器控制条上的 CC 菜单来管理所有字幕功能:

2. 字幕菜单(CC 菜单)
点击播放器控制条上的 CC 按钮,即可打开字幕菜单面板。菜单包含以下功能区域:
| 菜单项 | 说明 |
|---|---|
| 显示字幕 | 全局开关,开启或关闭字幕显示 |
| 双语字幕 | 开关双语模式,开启后切换为双列布局分别指派主/副字幕(仅在已加载 ≥2 条字幕后出现) |
| 字幕选择区 | 单列列表或双列布局(主字幕 / 副字幕),点击即可切换当前播放的字幕轨道 |
| 添加字幕文件 | 打开文件选择器,支持同时选择多个 .srt、.vtt、.bcc、.json 格式文件 |
| 字幕搜索 | 打开字幕搜索面板,支持关键词全文检索 |
| 字幕翻译 | 打开字幕翻译面板(仅当播放器配置了 translateApi 时显示) |
| 字幕设置 | 打开字幕样式设置面板,可调整主/副字幕的字号、颜色、勾边、位置等 |
3. 添加字幕
zwplayer 提供三种方式加载字幕:
3.1 通过菜单添加
在 CC 菜单中点击 “添加字幕文件” 按钮,在弹出的文件选择器中选择本地字幕文件(支持多选)。支持格式:.srt、.vtt、.bcc、.json。
3.2 通过 API 动态添加
使用 addSubtitle(url, pos, title) 方法在运行时动态添加字幕轨道:
// 设置主字幕(pos 为 '1')
player.addSubtitle('https://example.com/movie_zh.srt', '1', '中文字幕');
// 设置副字幕(pos 为 '2')
player.addSubtitle('https://example.com/movie_en.srt', '2', 'English');
url:字幕文件地址(支持 HTTP/HTTPS URL 或本地文件对象)pos:字幕轨道标识,'1'为主字幕、'2'为副字幕。其他值或不传则仅加入字幕列表,可在菜单中手动选择title:字幕名称(在菜单中显示)
3.3 通过初始化配置
在创建播放器时通过 subtitles 参数传入。支持 URL 字符串、数组或对象数组:
// 单个字幕
subtitles: 'https://cdn.example.com/subtitles/movie.vtt'
// 多个字幕(按数组顺序自动分配 pos)
subtitles: ['movie_zh.srt', 'movie_en.srt']
// 等同于 addSubtitle('movie_zh.srt', '1') 和 addSubtitle('movie_en.srt', '2')
// 对象格式:可自定义 title 和 pos
subtitles: [
{ url: 'movie_zh.srt', title: '中文', pos: '1' },
{ url: 'movie_en.srt', title: 'English', pos: '2' },
{ url: 'movie_jp.srt', title: '日本語' }
// 未指定 pos 的字幕仅加入列表,可在菜单中手动选择
]
pos 赋值规则:
| pos 值 | 效果 |
|---|---|
'1' |
分配到主字幕轨道,自动渲染显示 |
'2' |
分配到副字幕轨道,自动渲染显示 |
| 未指定或其他值 | 仅加入字幕列表,可在 CC 菜单中手动选择指派到主/副轨道 |
向后兼容:原有
addSubtitle(url, '1')/addSubtitle(url, '2')用法完全不受影响。
支持的字幕格式
- JSON:
zwplayer自定义格式 - SRT:大多数视频网站采用的格式
- VTT:Web 视频字幕标准格式
- BCC:Bilibili 字幕格式(JSON 格式)
4. 双语字幕选择
zwplayer 支持同时显示两路不同语言的字幕。开启双语模式的方法:
- 确保已加载 ≥2 条字幕轨道
- 打开 CC 菜单,开启 “双语字幕” 开关
- 菜单自动切换为双列布局,左侧为 主字幕、右侧为 副字幕
- 分别在两列中点击选择要显示的字幕轨道
关闭双语开关后,菜单恢复为单列列表模式。
5. 字幕设置
在 CC 菜单中点击 “字幕设置”,打开字幕样式设置面板。面板顶部有 主字幕 / 副字幕 两个 Tab,可分别调整每路字幕的样式。
5.1 字号
每路字幕独立设置,提供 5 档:
| 选项 | 值 | 说明 |
|---|---|---|
| 最小 | 0.08 |
适合信息密集型视频 |
| 小 | 0.14 |
副字幕默认值 |
| 中 | 0.2 |
主字幕默认值 |
| 大 | 0.28 |
适合大屏观看 |
| 最大 | 0.36 |
适合远距离观看 |
5.2 颜色
每路字幕独立设置,提供 12 种预设颜色:
白色、浅灰、深灰、黄色、橙色、红色、绿色、青色、蓝色、紫色、粉色、黑色
5.3 勾边
每路字幕独立设置,提供 4 种勾边样式:
| 选项 | 说明 |
|---|---|
| 无 | 不勾边 |
| 重描边 | 粗描边,适合浅色字幕 |
| 阴影 | 文字投影,自然柔和 |
| 45° 阴影 | 斜向投影效果 |
5.4 位置
全局设置(作用于主字幕),通过 6 宫格选择器定位:
| 位置 | 说明 |
|---|---|
| 左上 / 上 / 右上 | 屏幕上方区域 |
| 左下 / 下 / 右下 | 屏幕下方区域(默认) |
5.5 其他选项
| 选项 | 说明 |
|---|---|
| 缩放 | 字幕尺寸随视频播放窗口大小自动缩放(默认开启) |
| 淡入淡出 | 字幕出现和消失时带有渐隐过渡效果 |
| 背景不透明度 | 滑块调节,范围 0–100%(默认 60%),0 为全透明 |
设置面板底部提供 “恢复默认” 按钮,一键重置所有选项。
6. 字幕搜索
在 CC 菜单中点击 “字幕搜索”,打开字幕搜索面板。
使用方法
- 在搜索输入框中输入关键词,匹配结果实时更新
- 双语模式下:面板顶部显示 全部 / 主 / 副 三个范围筛选按钮,可按字幕轨道过滤
- 单击搜索结果 → 跳转到对应时间点
- 播放过程中,搜索结果会自动高亮当前正在显示的字幕条目
行级定位与搜索态挂起
在搜索结果中定位某条字幕后,常常需要查看它的上下文(前后相邻的字幕),或基于它做跨行段落循环。面板提供「定位 + 挂起 / 恢复」机制,让这两种操作无缝衔接:
- 📍 定位按钮:输入关键词后,每条搜索结果左侧会出现一个定位按钮(仅在搜索结果列表中显示)。点击它,面板会切换到全量字幕列表,自动滚动到该条字幕并置于可视区顶部,同时关键词会持续高亮,方便在上下文中识别。
- 挂起状态:定位后面板进入「挂起态」——底部状态栏会出现一个 「↩ 恢复对「关键词」的搜索」 按钮,表示当前显示的是全量列表,但你的搜索词仍被保留。此时可自由滚动浏览上下文、进行跨行段落循环等操作。
- 恢复搜索:在全量列表中完成操作后,点击状态栏的「恢复搜索」按钮,面板会基于最新的字幕数据重新执行过滤,回到搜索结果列表,继续检索下一条。
- 解除挂起:挂起状态下,清空搜索框(点 ✕ 或删除文本)会直接回到纯净的全量列表,挂起状态解除。
💡 设计要点:定位 + 挂起机制让你在「精准定位某条字幕」和「在全量列表中做跨行操作」之间自由切换,而不会丢失搜索上下文。
搜索范围
搜索会遍历已加载的所有字幕条目,对字幕文本内容进行关键词匹配,结果显示时间戳和上下文内容。
7. 字幕循环
在字幕搜索面板中,每条搜索结果右侧都有一个 循环按钮。点击后,播放器将在该字幕条目的时间区间内循环播放,再次点击取消循环。
跨行段落循环:在全量列表(或挂起态定位后的全量列表)中,连续点击两条字幕的循环按钮,可将它们聚合成一个循环块,播放器会在跨越多条字幕的整段区间内循环。再次点击区间端点的循环按钮可调整或解除区间。
注意事项
- 字幕循环与章节循环共用同一播放槽位,同时只能有一个循环生效
- 如果正在播放字幕循环期间手动拖动进度条到循环区间外,循环将自动解除
- 搜索结果列表中不支持跨行段落循环:搜索命中条目通常不连续,跨行扩展会指向列表外的字幕,因此搜索结果列表中每条仅支持单句循环。如需段落循环,请先用 📍 定位按钮切到全量列表
- 双语「全部」模式下不支持段落循环:双语混合时跨轨区间会混乱,因此「全部」轨道筛选下(无论搜索结果还是全量列表)仅支持单句循环。如需段落循环,请切换到「主」或「副」单轨
8. 字幕翻译
在 CC 菜单中点击 “字幕翻译”,打开字幕翻译面板。配置 translateApi 参数后该按钮自动出现,用户可选择目标语言将当前字幕翻译为对应语言,翻译结果作为副字幕叠加显示。详细配置请参阅 参数配置 → translateApi。
8.1 翻译服务协议
用户可根据以下协议自行实现翻译服务端,并通过 translateApi 参数将服务地址配置到播放器中。
播放器向翻译服务发送 POST 请求,编码为 multipart/form-data,包含以下字段:
| 字段 | 类型 | 说明 |
|---|---|---|
file |
File | 原始字幕文件,SRT 格式,文件名为 subtitle.srt |
targetLang |
String | 目标语言名称(如 "中文"、"英语"、"日语" 等) |
outputFormat |
String | 输出格式,固定为 "srt" |
翻译服务应返回 JSON 格式的响应,结构如下:
{
"success": true,
"data": {
"content": "1\n00:00:15,000 --> 00:00:17,951\n在左边我们可以看到……\n\n2\n00:00:18,166 --> 00:00:20,083\n在右边我们可以看到……\n\n3\n00:00:20,119 --> 00:00:21,962\n……那些摇头晃脑的家伙\n\n",
"format": "srt",
"totalSubtitles": 3,
"filename": "subtitle.translated.srt"
}
}
| 字段 | 类型 | 说明 |
|---|---|---|
success |
Boolean | 是否翻译成功 |
data.content |
String | 翻译后的 SRT 格式字幕内容(success=true 时必有) |
data.format |
String | 输出格式标识,固定 "srt" |
data.totalSubtitles |
Number | 翻译后的字幕条目数 |
data.filename |
String | 翻译后的建议文件名 |
error |
String | 失败原因(success=false 时返回,播放器会拼接到错误提示中展示给用户) |
失败响应示例:
{ "success": false, "error": "Unsupported target language" }
请求超时时间默认 30 秒。
9. HLS 内嵌字幕预加载
9.1 背景与原理
HLS 流的内嵌字幕(Closed Captions)采用分段传输机制,每个字幕条目被切分为多个小片段随视频流逐段下载。这意味着传统播放器只能边播边获取当前播放位置附近的字幕片段,无法一次性获取完整字幕文件,导致字幕搜索和翻译功能在 HLS 场景下难以使用。
ZWPlayer 通过预构建机制解决这一限制:播放器在检测到 HLS MANIFEST 中的内嵌字幕轨后,会主动逐个下载所有字幕分段,并将它们拼接为完整的字幕文件。即使视频尚未播放到对应位置,用户也可以对全部字幕内容进行全文检索和翻译。
9.2 预加载的字幕管理
预加载完成后,HLS 内嵌字幕将获得与外挂字幕完全一致的待遇:
- 自动加入 CC 菜单:预构建的字幕轨道自动出现在字幕选择列表中,用户可一键切换为主字幕或副字幕
- 全文搜索:在字幕搜索面板中可对全部字幕条目进行关键词检索,单击跳转到对应时间点
- 字幕翻译:可通过翻译面板将未播放部分的字幕内容提前翻译为目标语言
- 统一处理:HLS 内嵌字幕与外挂字幕在搜索、翻译、设置等功能中采用相同的数据结构,无需区分处理
9.3 字幕导出与二次利用
配合 subtitleDownload 配置,用户可将预构建的 HLS 内嵌字幕导出为 SRT 文件下载到本地,便于后续重新编辑、翻译或与其他视频复用。
对于内容平台和在线教育场景,这一机制意味着无需为 HLS 视频单独准备外挂字幕文件,即可在播放器中直接利用内嵌字幕完成搜索、翻译和导出的完整工作流。
10. JSON 字幕格式说明
示例文件
{
"font_size": 0.4,
"font_color": "#FFFFFF",
"background_alpha": 0.5,
"background_color": "#9C27B0",
"Stroke": "none",
"type": "AIsubtitle",
"lang": "zh",
"version": "v1.4.0.4",
"body": [
{
"from": 7.26,
"to": 8.79,
"sid": 1,
"location": 2,
"content": "进入21世纪"
},
{
"from": 8.79,
"to": 12.68,
"sid": 2,
"location": 2,
"content": "中国成为世界舞台上的重要角色"
},
{
"from": 14.79,
"to": 18.68,
"sid": 3,
"location": 2,
"content": "中国是世界人口最多的国家之一"
}
]
}
文件级属性说明
| 属性名 | 说明 | 是否必须 |
|---|---|---|
| font_size | 字体尺寸(相对尺寸),计算方式:将视频缩放为1024×576,32像素字体尺寸为1,实际的字体尺寸根据这个值计算出来的,以便于字幕尺寸在视频播放窗口发生变化时同步变化。 | 可选 |
| font_color | 字体颜色(HTML颜色值) | 可选 |
| background_alpha | 字体背景透明度(1为不透明,0为全透明) | 可选 |
| background_color | 字体背景颜色 | 可选 |
| Stroke | 字体是否勾边 | 可选 |
| type | 字幕类型(实际渲染用不到) | 可选 |
| lang | 字幕语言(如:zh、zh-TW、en) | 可选 |
| version | 制作工具版本(实际渲染用不到) | 可选 |
| body | 字幕具体内容(JS数组) | 必须 |
字幕元素属性(body)说明
每个字幕元素为一个对象,包含在 body 数组中,具有以下属性:
| 属性名 | 说明 | 是否必须 |
|---|---|---|
| from | 字幕开始时间(相对于媒体时间,单位:秒) | 必须 |
| to | 字幕结束时间(相对于媒体时间,单位:秒) | 必须 |
| sid | 字幕元素ID | 可选 |
| location | 字幕呈现位置 | 可选 |
| content | 字幕文本内容 | 必须 |
11. 其他格式说明
SRT 与 VTT 文件是标准的字幕文件格式,zwplayer 也全面支持加载这些文件。关于这些字幕文件的详细格式说明,请参考相关技术文档。
12. 代码示例
以下示例演示如何在 zwplayer 中加载双语字幕:
<script language="javascript">
window.mainplayer = new ZWPlayer({
url: 'http://example.com/vod/movie.mp4',
playerElm: '#player-holder', // 可以是元素ID或DOM对象
});
// 在时钟事件中延时加载字幕
setTimeout(function() {
if (window.mainplayer) {
// 设置第一字幕(主字幕)
window.mainplayer.addSubtitle('http://example.com/data/movies.en.srt', '1', 'English');
// 设置第二字幕(副字幕)
window.mainplayer.addSubtitle('http://example.com/data/movies.zh.srt', '2', '中文字幕');
}
}, 1000);
</script>
13. 注意事项
- 建议在视频加载完成后再加载字幕,以确保最佳用户体验
- 除
body属性外,JSON格式的其他属性均可省略 - 字幕轨道标识(
'1'、'2')用于区分双字幕显示位置 - 字幕翻译功能需要配置
translateApi参数,未配置时翻译按钮不会出现在菜单中;用户可根据协议自行实现翻译服务端 - 字幕循环与章节循环共用同一播放槽位,同时只能有一个循环生效;手动 seek 到循环区间外会自动解除循环
- 在线工具:可通过 在线字幕编辑工具 创建、翻译和导出 SRT、VTT 等格式字幕