Skip to content

Latest commit

 

History

History
426 lines (333 loc) · 30.2 KB

字幕流.md

File metadata and controls

426 lines (333 loc) · 30.2 KB

字幕流

字幕分类

  • 软字幕:过程可逆,可以提取出字幕文件,查看字幕源代码
    • 内挂字幕:一般指字幕文件与视频一同封装在MKV文件中,播放时需经过播放器处理解析显示(=VSFilter渲染)
    • 外挂字幕:以单独的字幕文件形式存在,播放时经播放器处理解析显示(VSFilter 渲染)到视频上
  • 硬字幕(内嵌字幕):指字幕被以图形方式硬编码到视频中,变成视频数据本身,为视频数据的一部分。过程不可逆,无法再把字幕提取出来,播放时不需要额外的播放器读取解析显示(VSFilter 渲染)字幕

字幕格式

常见的字幕有 srt、ssa、ass 等格式,本文主要介绍下 ssa 和 ass 的格式。

  1. 什么是 SSA?

    SSA(SubStation Alpha),是由 CS Low(亦称 Kotus)创建,比传统字幕格式(如 SRT)功能更加先进的字幕文件格式。该格式字幕的外挂文件以 *.ssa 作为后缀。

  2. 什么是 ASS?

    ASS(Advanced SubStation Alpha),是一种比 SSA 更为高级的字幕格式, 其实质版本是 SSA v4.00+,它是基于 SSA 4.00+ 编码构建的。该格式字幕的外挂文件以 *.ass 作为后缀。

    ASS的主要变化就是在SSA编写风格的基础上增添更多的特效和指令。

[!TIPS] SSA/ASS 的基本结构

  • SSA/ASS 字幕是一种类ini风格纯文本文件;包含五个 section[Script Info][v4+ Styles][Events][Fonts][Graphics]
    1. [Script Info]:包含了脚本的头部和总体信息。[Script Info] 必须是 v4 版本脚本的第一行。
    2. [v4 Styles]:包含了所有样式的定义。每一个被脚本使用的样式都应该在这里定义。ASS 使用 [v4+ Styles]
    3. [Events]:包含了所有脚本的事件,有字幕、注释、图片、声音、影像和命令。基本上,所有在屏幕上看到的内容都在这一部分。
    4. [Fonts]:包含了脚本中内嵌字体的信息。
    5. [Graphics]:包含了脚本中内嵌图片的信息。

字幕的技巧

如果需要提取字幕,首先字幕的格式必须是软字幕

ffmpeg -i video_file.mp4 -map 0:s:0 subtitle.srt
  • 参数含义:
    • i video_file.mp4:input输入文件是video_file.mp4
    • map 0:s:0 subtitle.srt 的含义:0 -> input_file_id 为文件 id,输入的文件索引编号,此处就一个文件,所以 0 表示此处输入的 mp4 视频:video_file.mp4;:s -> :stream_specifier, 流(s)选择的是字幕 subtitle;:0 -> :stream_specifier0 个字幕,此处只有一个字幕,就是这个唯一的字幕。
    • subtitle.srt:输出的字幕文件名

转换字幕(srt → ass)

ffmpeg -i subtitle.srt subtitle.ass

嵌入字幕

如果不考虑字幕的位置,则可以直接嵌入字幕,其中字幕文件是 srt 或 ass 均可

  • 指定字幕的具体的位置(不同区域,具体边距等)。
  • 前提:必须是 ass 文件(才能用参数指定字幕位置),srt 无法指定字幕位置;如果是 srt 文件,则需要先去转换成 ass 文件

给视频流加硬字幕

  • --enable-libass:如果使用 subtitles 过滤器烧录 ass 文件才需要的,此外还需要使用 libavcodeclibavformat 编译器烧录
  • 字幕文件分别是 ass、subtitles 的形式,可以使用不同的过滤器,但是 ass 文件使用 subtitles 过滤器完全可以
    • 由于 ass 过滤器支持更高级的透明度选项,而且可以不使用 libavcodec 和 libavformat 这两个库
ffmpeg -i demo.mp4 -vf ass=subtitle.ass output.mp4
或
ffmpeg -i demo.mp4 -vf subtitles=sample.srt out.mp4

SRT 字幕的使用

SRT(S ripper)是最简单的文本字幕格式,后缀名为 .srt,其组成为:一行字幕序号,一行时间代码(hh:mm:ss,msmsms),一行字幕数据这三部分组成。

  • 常用的字幕格式
<font color=red>颜色</font>
<font size=”10px”>字体大小</font>
<i>字体斜体</i>
<u>字体下加划线</u>
<br>换行
<b>字体加粗</b>
  • 其中颜色是 16进制的 RGB
21
00:03:10,600 –> 00:03:15,000
what the fuck
  • 字幕之间需要加空格或者回车 (这里)
1
00:00:05,255 --> 00:00:06,654
...something they had never seen,

2
00:00:06,756 --> 00:00:08,087
which liberated a yellow,

3
00:00:08,191 --> 00:00:09,988
very pungent and acrid vapor.

ASS 字幕的使用

ASS 字幕格式规范 · weizhenye/ASS Wiki

Info 部分

[Script Info]
; Script generated by FFmpeg/LavcLIBAVCODEC_VERSION
ScriptType: v4.00+
PlayResX: 384
PlayResY: 288
ScaledBorderAndShadow: yes
  • 384*288 是标准的 4:3 画面分辨率之一。ssa/ass 中的字幕位置根据这两个参数来定义
  • 屏幕的左上角是 (0,0),屏幕的右下角是 (playResX, playResY)
  • 注意:对于一个已经存在并且文本坐标都设置好的 SSA 文件,如果它的 PlayResXPlayResY 数值和视频文件的长宽尺寸不符(包括成比例的情况,比如视频文件尺寸为640x360,而 PlayResX: 320,PlayResY: 180),我们不要简单的把 PlayResXPlayResY 数值改成屏幕尺寸,这样将导致字幕失真,是因为文本部分的尺寸并没有改,仍按照原来的PlayResX和PlayResY数值设定.如果有较多的坐标设定,就不要改原来的 PlayResXPlayResY 数值,在原基础上编辑.
脚本行 备注
; 分号,后面可以跟任何内容。只在脚本中用作注释。加载脚本时不可见。分号必须是该行的第一个字符。旧版本中使用!:注释
Title 标题,对脚本的描述。如果未指定,自动设置为 untitled
Original Script 最初创建脚本的作者。如果未指定,自动设置为 unknown
Original Translation (可选)最初翻译对话的人。如果未指定,该项不显示
Original Editing (可选)最初脚本的编辑者,通常是对翻译润色和校对的人。如果未指定,该项不显示
Original Timing (可选)最初的时间轴人员。如果未指定,该项不显示
Synch Point (可选)指明什么时候脚本应该开始播放。如果未指定,该项不显示
Script Updated By (可选)对原脚本进行更新的其他字幕团体的人。如果未指定,该项不显示
Update Details (可选)其他字幕团体对原脚本更新的细节。如果未指定,该项不显示
ScriptType SSA 脚本格式的版本。例如 V4.00。如果当前使用的 SSA 程序版本旧于脚本的版本,将给出警告
Collisions 为了防止字幕重叠,它决定了字幕如何移动。如果设置为 Normal,SSA 将尝试使用 Margins 指定的位置来定位字幕。同时,字幕会垂直地移动来防止重叠。在 Normal 的防重叠模式下,新字幕会出现在已存在字幕的上方,但它会寻找最低的不产生重叠的位置,来填补其他字幕产生的「空隙」。如果设置为 Reverse,已存在的字幕会上移给新字幕腾出空间。这意味这字幕总是可以自上向下地阅读,但也意味着已存在的字幕可能会在新字幕出现之前出现在屏幕的中间。它会占用大量的屏幕区域。
PlayResY 渲染字幕时的渲染范围的高度。如果使用 Directdraw 播放,SSA v4 会自动选择最接近的已启用的设置
PlayResX 渲染字幕时的渲染范围的宽度。如果使用 Directdraw 播放,SSA v4 会自动选择最接近的已启用的设置
PlayDepth 渲染字幕时的颜色深度。如果使用 Directdraw 播放,SSA v4 会自动选择最接近的已启用的设置
Timer 脚本的计时器速度,使用浮点的百分比。例如,100.0000 代表 100%,保留四位小数。计时器速度是应用于 SSA 时钟的时间乘数,以提供斜坡时间来扩展或压缩脚本的总时间。速度大于 100% 会减少脚本总时间,意味着字幕会逐步地越来越早地出现;速度小于 100% 会增加脚本总时间,意味着字幕会逐步地越来越晚地出现(就像一个正的斜坡时间)。扩展和压缩只发生在脚本播放时,这个值不会改变脚本事件部分的实际时间。
WrapStyle 定义了默认的换行方式。0:智能换行,分割比较均匀,上面的行较长。1:从行尾的词换行,只有 \N 能强制换行。2:不换行,\n 和 \N 强制换行。3:和 0 一样智能换行,下面的行较长。
ScaledBorderAndShadow 指定边框宽度与阴影深度是否随着视频分辨率等比例缩放,默认为 No。当值为 No 时,边框宽度与阴影深度完全按照指定的像素数显示;当值为 Yes 时,边框宽度与阴影深度随着实际视频的分辨率同等比例缩放。

Styles 部分

  • 这一部分包含了所有样式的定义。每一个被脚本使用的样式都应该在这里定义。区别于 SSA,ASS 使用 [v4+ Styles] 关键字。
[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Arial,16,&Hffffff,&Hffffff,&H0,&H0,0,0,0,0,100,100,0,0,1,1,0,2,10,10,10,0
  • 这一部分用来定义字幕的外观和位置,以便 [Events] 部分直接引用。此部分由格式行(Format:)和样式行(Style:)组成。除边框样式外,所有样式都可以在 [Events] 部分使用代码重设。
  • 格式行和样式行的内容一一对应。格式行定义了如何解释样式中的每个字段,因此格式行必须出现在所有的样式之前,且格式行中列出的字段名必须拼写正确!
格式名 备注
Name 样式名称(用于 [Events] 部分引用,区分大小写,不能包含逗号)
Fontname 字体名称( Windows所使用的字体名称,区分大小写)
Fontsize 字体大小(字号)
PrimaryColour 主体颜色(一般情况下文字的颜色)
SecondaryColour 次要颜色(在卡拉OK效果中字幕由次要颜色变为主体颜色)
OutlineColor 边框颜色
BackColour 阴影颜色
Bold 粗体(-1=开启,0=关闭)
Italic 斜体(-1=开启,0=关闭)
Underline 下划线(-1=开启,0=关闭)
Strikeout 删除线(-1=开启,0=关闭)
ScaleX 横向缩放(单位%,100即正常宽度)
ScaleY 纵向缩放(单位%,100即正常高度)
Spacing 字间距(单位像素,支持小数)
Angle 旋转角度(绕z轴逆时针旋转\frz,负数=顺时针旋转。单位度,支持小数)
BorderStyle 边框样式(1=边框+阴影,3=不透明底框)
Outline 边框宽度(单位像素,可用小数)
Shadow 阴影深度(单位像素,可用小数,右下偏移)
Alignment 它设置文本如何在屏幕上根据左右边距对齐和垂直位置. 其中,1=居左,2=居中,3=居右。上述的值加 4 出现在屏幕顶部,上述的值加 8 出现在屏幕中间。例如,5=屏幕顶部居左。但是在 ASS 中是按数字键盘对应的位置(1-3 为底部,4-6 为中部,7-9 为顶部),所以取值范围是 1~11 没有 4 和 8 两个数字
MarginL 左边距(字幕距左边缘的距离,单位像素,右对齐和中对齐时无效,取值 0~PlayRestX
MarginR 右边距(字幕距右边缘的距离,单位像素,左对齐和中对齐时无效,取值 0~PlayRestX
MarginV 它定义了垂直边距(为像素)。对于底部字幕,它是字幕和屏幕底部的距离。对于顶部字幕,它是字幕和屏幕顶部的距离(取值 0~PlayRestY)对于中部字幕,该值被忽略,字幕会垂直居中。
Encoding 编码( 0=ANSI,1=默认,128=日文,134=简中,136=繁中,一般用默认1即可 )

Events

[Event] 部分由格式行(Format:)和多个事件行组成。格式航定义了事件行中各种字段的具体含义,因此格式行必须出现在所有事件前。

Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:02.00,0:00:03.80,Default,,0,0,200,,We're the last generation.
Dialogue 这是一个“对话”事件,用于显示一些文本。
Comment 这是一个“评论”事件,它包含与对话、图片、声音、电影或命令事件相同的信息,但在脚本回放期间会被忽略。
Picture 这是一个“图片”事件 ,意味着SSA将显示指定的 .bmp.jpg.gif.ico.wmf 图形(不支持 .png, 且 filter 不支持加载图片)。
Sound 这是一个“声音”事件,意味着 SSA 将播放指定的 .wav 文件。(filter 不支持
Movie 这是一个“影片”事件,意味着 SSA 将播放指定的 .avi 文件。(filter 不支持
Command 这是一个“命令”事件,意味着 SSA 将执行指定的程序作为后台任务。(filter 不支持

格式行

Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
字段名 备注
Marked Marked=0,表示在 SSA 中该行不显示为已标识。Marked=1,表示在SSA中该行显示为已标识。通常设置 Marked 为 0
Layer 任何整数。有不同图层数值的字幕会在重叠检测中被忽略。大数值的图层会覆盖在小数值的图层上面。
Start 事件的开始时间,格式为 0:00:00:00(小时:分:秒:毫秒),最小单位为 0.01s。它是字幕显示在屏幕上时脚本播放经过的时间。注意小时只有一位。
End 事件的结束时间,格式为 0:00:00:00(小时:分:秒:毫秒)。它是字幕在屏幕上消失时脚本播放经过的时间。注意小时只有一位。
Style 样式名。如果为 Default,那么你自己的 Default 样式会取代它。然而,如果脚本作者要使用的Default样式已存储在脚本中却被 SSA 忽略了,如果你要使用它,你可以修改样式定义行里的名称,以便它出现在脚本的样式列表里。在实际的应用中,若在 [v4+ Styles] 中定义好 Default 样式,如果之后使用了未定义的样式名,那么就使用 Default 样式。如果 Default 样式也没有定义,那样才使用渲染器自带的样式。
Name 角色名。说这条对白的角色名。只为了在编辑和设定时间轴时方便辨认。
MarginL 4 位的左边距覆写值(为像素)。0000 表示使用在 Style 行中定义的值。
MarginR 4 位的右边距覆写值(为像素)。0000 表示使用在 Style 行中定义的值。
MarginV 4 位的垂直边距覆写值(为像素)。0000 表示使用在 Style 行中定义的值。
Effect 过渡效果。可以为空值,或者为在SSA v4.x实现的三种过渡效果之一。效果名称区分大小写,必须正确拼写,不加引号。Karaoke,表示卡拉 OK 效果,依次高亮每个字。作为一个效果类型已经废弃不用。Scroll up;y1;y2;delay[;fadeawayheight],表示文本或图片会在屏幕上向上滚动。Scroll up 之后的参数字段用分号分隔。y1 和 y2 值(为像素)定义了文本在屏幕上滚动的垂直区域。两个值位置可以互换。如果两个值都是 0,文本会在整个屏幕高度向上滚动。delay 值可取值 1 到 100 以降低滚动的速度,0表示无延迟按原速度滚动。当 delay 值大于 1 时,移动 1 像素需要(1000/delay)秒。fadeawayheigh值可选,可以使文本滚动到其范围的边缘时呈现淡出效果。Scroll down;y1;y2;delay[;fadeawayheight],同上,为向下滚动。Banner;delay[;lefttoright;fadeawaywidth],表示所有文本都忽略长度到一行里,从右向左滚动经过屏幕。delay 值同上。lefttoright 值可选,取值 0 或1。默认为0,表示从右向左滚动。fadeawaywidth 值同上。
Text 字幕文本。它是作为字幕实际出现在屏幕上的文本。任何第 9 个逗号之后的文本都被当作是字幕文本,所以它可以包含逗号。文本中可以包含表示换行的 \n 代码,也可以包含在大括号 {} 之间出现的样式覆写控制代码。

样式覆盖以及特效

  • 除了 \h\n\N,所有覆写代码都写在大括号 {} 内。
  • 所有覆写代码都以反斜杠 \ 开头。
  • 一个大括号 {} 内可以放多个覆写代码。
  • 所有覆写代码都作用于其后的所有文字。如果要让某个覆写代码只作用于选定的文字,你要在选定文字的后面加一个「取消」用的覆写代码,来取消前面那个覆写代码。
  • 某些覆写代码会自动作用于整行文本,目前只有 Alignment 代码,之后可能会加入更多(例如,阴影和边框深度的覆写)。
  • \pos\move 等也会作用于整行文本,下面的具体说明中会提到。

[!TIPS] <> 包围的表示参数,用 [] 包围的表示可选,<../..>选择一项

覆写代码 释义及备注
\n 换行。如果启用了智能换行,\n会被忽略。写法举例:这是第一行 \n 这是第二行。\n 只在WrapStyle:2 或 \q2 时会换行,其他模式下都相当于一个空格。
\N 强制换行。当智能换行启用时用来代替 \n 实现换行。任何模式下都会强制换行。在 xy-VSFilter 中,\N 在过渡效果 Banner 中也会换行;在 libass 中,\N 在 Banner 中不换行,相当于空格。
\h 硬空格。不换行,暨可确保在显示字幕时不会在它的这个空格上分行(保证左右两个词在同一行)。
\b<0/1> \b1 文本加粗,\b0 取消粗体。当该参数大于 1,它会作为字体的重量值(400 = 普通,700 = 粗体,注意:大多数字体的粗细可以量化为 2-3 个等级)。
\i<0/1> \i1 文本加斜体,\i0 取消斜体。
\u<0/1> \u1 给文本加下划线,\u0 取消文本下划线。
\s<0/1> \s1 给文本加删除线,\s0 取消文本删除线。
\bord<宽度>\xbord<宽度>\ybord<宽度> 边框宽度,单位为像素,可以是小数。有x或y时可以单独设置沿 X 轴或 Y 轴的边框宽度。写法举例:\bord1、\xbord2、\ybord3。
\shad<深度>\xshad<深度>\yshad<深度> 阴影深度,单位为像素,可以是小数。有x或y时可以单独设置沿X轴或Y轴的阴影深度。写法举例:\shad1、\xshad2、\yshad3。
\fn<字体名> 指定一个系统中已安装的字体。区分大小写。如果指定的字体没有安装,那么会使用 Arial字体。写法举例:\fn微软雅黑。
\fs<字体尺寸> <字体尺寸> 是一个数字,指定了字体点的尺寸。注意,这里的字体尺寸并不是字号的大小,\fs20 并不是字体大小(font-size)为 20px,而是指其行高(line-height)为 20px,主要是因为 VSFilter 使用的 Windows GDI 的字体接口。
\fs+<数值>\fs-<数值> 将当前文本的字体尺寸乘一定的倍数。例如,\fs+2 表示将当前文本的字体尺寸乘 1.2,\fs-3表示将当前文本的字体尺寸乘0.7。计算方式为(10 ± <数值>) * 当前字体尺寸,当计算的结果小于等于0时结果不生效,即依然为原来的字体尺寸。
\fscx<百分数>\fscy<百分数> 缩放文字大小。\fscx<百分数> 为水平缩放,\fscy<百分数> 为垂直缩放。写法举例:\fscx233.33、\fscy50。可适用于矢量图形。
\fsp<像素值> 它改变字符之间的距离,默认为0。写法举例:\fsp3。
\fr<度数>\frx<度数>\fry<度数>\frz<度数> 表示沿 X/Y/Z 轴旋转一定的度数。\fr<度数> 表示沿 Z 轴旋转。写法举例:\fr30、\frx-30、\fry-233.33、\frz480。其旋转的原点由 \org 决定,如果没有指定 \org,那么按「默认定位点」来旋转。
\fax<因数>\fay<因数> 分别沿X轴和Y轴对文字行进行倾斜调整。如 \fax-0.5 等同于斜体。一般情况下因数的绝对值不要超过 2。
\fe<字符集> 指定文字的字符集(字体编码)。通常 0 为英文,1 为系统默认,134 为简体中文,136 为繁体中文。一般字幕文件保存为 Unicode 方式编码如UTF-8时,可以忽略该设置。
[<颜色序号>]c[&][H][&] <BBGGRR> 是一个十六进制的 RGB 值,但颜色顺序相反,前导的0可以省略。<颜色序号>可选值为 1、2、3 和 4,分别对应单独设置PrimaryColour、SecondaryColour、OutlineColor 和 BackColour,<color> 未写时相当于设置为 PrimaryColour。写法举例:\c&HFF0000&、\1c&HFF&、\2c&HFF00&、\3c&HFFFFFF、\4cFFFFFF。其中的 &H 按规范应该是要有的,但是如果没有也能正常解析。
[<颜色序号>]c 当 c 后面不跟其他字符时,会设置为当前使用的 Style 中所定义的对应的值。
<颜色序号>a[&][H][&] 是一个十六进制的透明度数值,00 为不透明,FF 为全透明。<颜色序号> 含义同上,但这里不能省略。写法举例:\1a&H80&、\2a&H80、\3a80、\4a&H80&。其中的&和H按规范应该是要有的,但是如果没有也能正常解析。
\alpha[&][H][&] 是一个十六进制的透明度数值,00 为不透明,FF 为全透明。它默认相当于 \1a&H<AA>&。写法举例:\alpha80。
\a<位置> <位置>是一个数字,决定了字幕显示在屏幕上哪个位置。1、2、3 分别是底部的居左、居中、居右;5、6、7 分别是顶部的居左、居中、居右;9、10、11 分别是中部的居左、居中、居右。如果是0或者没有就设置为默认位置。如果出现了多个 \a 或 \an 则以第一个出现的为准。
\an<位置> 与小键盘布局相同。如果出现了多个 \a 或 \an 则以第一个出现的为准。
\q<方式> <方式>是一个数字,与 WrapStyle 相同。0:智能换行,分割比较均匀,上面的行较长。1:从行尾的词换行,只有 \N 能强制换行。2:不换行,\n\N 强制换行。3:和 0 一样智能换行,下面的行较长。
\r[<样式名>] <样式名> 是在 [v4 Styles+] 中定义的样式名,它会把这行中所有它之后的文本设置为样式名对应的样式。如果没有写 <样式名> 或者 <样式名> 没有被定义,将会设置为默认样式。例如,假设已定义了把字体设为蓝色的 Blue 样式,{\1c&HFF&} 这里是红色 {\rBlue} 这里是蓝色 {\1c&HFF00&} 这里是绿色。
\move(<x1>,<y1>,<x2>,<y2>[,<t1>,<t2>]) 提供字幕的移动效果。, 是开始点坐标,是结束点坐标。和是相对于字幕显示时间的开始运动与结束运动的毫秒时间。在之前,字幕定位在。在与之间,字幕从均速移动到。在之后,字幕定位在。当和没写或者都是 0 时,则在字幕的整段时间内均速移动。当一行中有多个 \pos 和 \move 时,以第一个为准。当 \move 和Effect 效果同时存在时,结果比较迷。当一行中含有 \move 时会忽略字幕重叠冲突的检测。
\pos(<x>,<y>) 将字幕定位在坐标点。屏幕的左上角为 0,0。字幕的「定位点」由 \a<位置>、\an<位置>和 Alignment 决定。例如:\an1 的定位点在字幕的左下角。\an2 的定位点在字幕底边的正中间。\an3 的定位点在字幕的右下角。\an4 的定位点在字幕左边线的正中间。\an5的定位点在字幕垂直水平的正中间。\an6 的定位点在字幕右边线的正中间。\an7 的定位点在字幕的左上角。\an8 的定位点在字幕顶边的正中间。\an9 的定位点在字幕的右上角。当一行中有多个 \pos 和 \move 时,以第一个为准。事实上 \pos(<x><y>) 相当于 \move(<x>,<y>,<x>,<y>,0,0)。当一行中含有 \pos 时会忽略字幕重叠冲突的检测。
\org(<x>,<y>) 设置字幕的原点为 ,。字幕的原点会影响其旋转效果,字幕是基于原点来旋转的。当未设置时默认为字幕的定位点。当一行中有多个\org时,以第一个为准。原点就是定位点,定位点就是原点。
\fad(<t1>,<t2>) 提供简单的淡入淡出效果。t1为淡入时间长度,t2为淡出时间长度。单位为毫秒。当一行中有多个 \fad 或 \fade 时,以第一个为准。
\fade(<a1>,<a2>,<a3>,<t1>,<t2>,<t3>,<t4>) 提供复杂的淡入淡出效果。单位为毫秒。当 \fade 只有两个参数时,其效果与 \fad 一致。当一行中有多个 \fad 或 \fade 时,以第一个为准。
[i]clip(<x1>,<y1>,<x2>,<y2>) 定义一个矩形,只有在该矩形范围内的内容可见或不可见。, 为矩形的左上角,为矩形的右下角。\clip 是矩形范围内可见,\iclip 是矩形范围内不可见。当一行中有多个[i]clip出现时,以最后一个为准。
[i]clip([<等级>,]<绘图命令>) 定义一个绘画图形,只有在该绘画图形范围内的内容可见或不可见。<等级> 和 <绘图命令> 的含义与 \p 相同。
  • FFmpeg 内部也有针对 ass 解析的代码,但相对简单。其中开源的 libass 库可以完美的支持各种 ass 特效
  • 对于颜色的定义,它的格式是 十六进制的(BGR)格式前加 &H,例如 &H8080ff(浅红)
    • 你也可以使用透明度的方式,格式:&HAABBGGRR

webvtt 字幕的使用

Web 视频文本轨格式(WebVTT) - Web API 接口参考 | MDN

WebVTT 是一种使用 <track> 元素显示定时文本轨道(如字幕或标题)的格式

  • 它的格式类似于 srt,但是需要在开头加上 WEBVTT

    WEBVTT
    
    00:00:22.230 --> 00:00:24.606
    This is the first subtitle.
    
    00:00:30.739 --> 00:00:34.074
    This is the second.
    
    00:00:34.159 --> 00:00:35.743
    Third
  • 我们可以给 .vtt 格式之后添加提示

    WEBVTT
    # 可以添加一些提示在文本行后
    WEBVTT - This file has cues.

文件格式

  1. 换行:需要使用手动换行,如果使用 \r, \n 一般情况下是没用的

    # 可以
    00:26.000 --> 00:29.800 align:middle line:40%
    An elderly man in Shanghai starved to death at home due to lockdown,
    and it was already smelly when he found out.
    
    # 不可以
    00:26.000 --> 00:29.800 align:middle line:40%
    An elderly man in Shanghai starved to death at home due to lockdown, \n and it was already smelly when he found out.
  2. 每个片段的基本格式

    # [] 表示可以有也可以没有
    [idstring]
    [hh:]mm:ss.msmsms --> [hh:]mm:ss.msmsms
    Text string
    
    #示例
    Cue-8
    00:00:52.000 --> 00:00:54.000
    I don’t think so. You?

样式

  1. 文本位置和对其方式. 但是这些格式需要写在设定的时间后

    设置 功能说明
    vertical rl
    line [-][0 or more] / [0-100]% 行位置,负数从框底部数起,正数从顶部数起。百分数意味着离框顶部的位置
    position [0-100]% 百分数意味着文字开始时离框左边的位置(如:英文字幕)
    size [0-100]% 百分数意味着 cue 框的大小是整体框架宽度的百分比
    align start | middle | end 指定 cue 中文本的对齐方式
    Cue-8
    00:00:52.000 --> 00:00:54.000 align:start size:15%
    I don’t think so. You?
  2. 内联样式

    说明
    c 用 c 定义 (CSS)类, 例如, <c.className>Cue text</c>
    i 斜体字
    b 粗体字
    u 添加下划线
    ruby 定义类似于 HTML5 的 http://dev.w3.org/html5/spec/the-ruby-element.html#the-ruby-element。在这样的内联样式中,允许出现一个或多个 <rt> 元素。
    v 如有提供,则用来指定声音标签。例如, <v Ian>This is useful for adding subtitles</v>。注意此声音标签不会显示,它只是作为一个样式标记。
  • ::cue 伪类是用在 css 中,选择所有字幕轨的伪类

    ::cue - CSS: Cascading Style Sheets | MDN

    • 示例

      ::cue {
            background: rgb(230, 203, 255);
            background-position: 50% 50%;
            color: rgb(21, 173, 223);
            font-size: 40px;
            line-height: 100px;
          }
      
      ::cue(b) {
            color: green;
          }
      
      ::cue(.red) {
            color: red;
          }
    • .vtt 文件

      // 
      00:02.000 --> 00:03.800 line:10%
      <b>We're the last generation.</b>
      00:04.000 --> 00:08.000
      <c.red>Don't not approach the dog at the door.</c>
      • 可以在 ::cue 使用的 css 属性 coloropacity、visibilitytext-decoration 及相关属性text-shadowbackground 及相关属性outline 及相关属性font 及相关属性包括 line-heightwhite-spacetext-combine-uprightruby-position

      • 抓取特定的声音标签

        • .vtt 格式
        Cue-8
        00:00:52.000 --> 00:00:54.000 align:start size:15%
        <v Emo>I don’t think so. <c.question>You?</c></v>
        video::cue(v[voice="Emo"]) { color:lime }

track 标签

  • HTML5 的 <track> 元素可以把外部轨道文件链接到特定资源上。<track> 元素的属性如下:

    名称 说明
    kind subtitles 字幕
    kind captions 标题,不仅仅是标题,还包括音效及其他音频信息。
    kind descriptions 描述,视频的文本描述。
    kind chapters 章节导航
    kind metadata 元数据
    src URL 指定资源URL
    srclang Language code 在 src 资源的语言
    label Free text 给元素添加标签
    default n/a 如果存在,且用户无其他特别设定,这个元素默认启用