SSA 转 SMI
或者粘贴字幕文本
这次转换会改变什么
有 3 项会被丢弃或需要你决定
- 样式
除粗体和斜体之外的全部样式(颜色、描边、阴影、边距)
- 卡拉 OK
卡拉OK计时(逐音节高亮)
- 格式专有内容
源格式保留在字幕条之外的内容(非字幕块、文件头文字、单条字幕的设置、被注释掉的事件)——目标格式没有地方存放它们
这份清单来自这两种格式的能力矩阵,而不是你加载的这份具体文件。如果具体文件用到了格式允许、但矩阵没有建模的特性,可能会丢得更多。
这一页把 SSA 转成 SMI(SAMI)。SAMI 用 <SYNC Start=…> 标记时间点,每条字幕写在它下面的 <P> 里;转换在浏览器里完成,不上传。
一个 SYNC 会替换屏幕上现有的内容,所以产物给每条字幕后面都跟一个 <P> 的空块,把屏幕清掉——少了它,上一条会一直留在画面上。时间值是整数毫秒,SSA 的 0:00:04.13 写成 Start=4130,不四舍五入。
强调会保留成标签:粗体、斜体、下划线与颜色写成 <b>、<i>、<u>、<font color="…">,浏览器认这些。样式表的其余部分没有落点:字体、字号、描边、阴影、边距都不会过去,嵌入字幕的页面用自己的 CSS 决定外观。卡拉OK 计时同样丢掉——SAMI 记不了一行内部的时刻。
产物按起始时间升序,UTF-8、Unix 换行、无 BOM,结构外壳是 SAMI 的 HEAD、STYLE 与 BODY,SCRIPT INFO 与内嵌资源不会出现。整季可以批量拖入,串行完成后打包下载。
示例
一份典型的 SSA 文件转成 SMI
输入
[Script Info]
Title: Example SSA
ScriptType: v4.00
Collisions: Normal
[V4 Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding
Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,1,2,2,2,10,10,10,0,1
[Events]
Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: Marked=0,0:00:01.00,0:00:04.00,Default,,0,0,0,,Hello there.
Dialogue: Marked=0,0:00:05.00,0:00:08.00,Default,,0,0,0,,{\i1}Italic{\i0} line.
Dialogue: Marked=0,0:00:09.00,0:00:12.00,Default,,0,0,0,,Two\Nlines
输出
<SAMI>
<HEAD>
<STYLE TYPE="text/css">
<!--
P { text-align: center; font-family: Arial, sans-serif; }
-->
</STYLE>
</HEAD>
<BODY>
<SYNC Start=1000>
<P>Hello there.
<SYNC Start=4000>
<P>
<SYNC Start=5000>
<P><i>Italic</i> line.
<SYNC Start=8000>
<P>
<SYNC Start=9000>
<P>Two<br>lines
<SYNC Start=12000>
<P>
</BODY>
</SAMI>
这份产物丢掉了样式表、卡拉OK 与脚本内容;强调标签与时间轴保留。
同一转换遇到一份脏文件
输入
[Script Info]
Title: Dirty SSA
ScriptType: v4.00
[V4 Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding
Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,1,2,2,2,10,10,10,0,1
[Events]
Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Comment: Marked=0,0:00:00.00,0:00:01.00,Default,,0,0,0,,not a subtitle
Dialogue: Marked=0,0:00:01.00,0:00:04.00,Default,,0,0,0,,{\b1}Bold{\b0} and {\u1}underlined{\u0}.
Dialogue: Marked=0,0:00:05.00,0:00:08.00,Default,,0,0,0,,A soft\nbreak and a {\p1}mystery{\p0} code.输出
<SAMI>
<HEAD>
<STYLE TYPE="text/css">
<!--
P { text-align: center; font-family: Arial, sans-serif; }
-->
</STYLE>
</HEAD>
<BODY>
<SYNC Start=1000>
<P><b>Bold</b> and <u>underlined</u>.
<SYNC Start=4000>
<P>
<SYNC Start=5000>
<P>A soft<br>break and a {\p1}mystery{\p0} code.
<SYNC Start=8000>
<P>
</BODY>
</SAMI>
真实文件里常见的损坏:混合换行、散落的空白、留空的字段。可以对照上面那份干净样例,看看解析器能容忍到什么程度。
常见问题
SSA 转 SMI 后,哪些样式还能留下来?
片段级的强调:粗体、斜体、下划线、颜色写成 <b>、<i>、<u> 与 <font color="…">,浏览器会照着渲染。样式表里的字体、字号、描边、阴影与边距都没有落点。
SSA 转 SMI 后,为什么每条字幕后面多一个空块?
SAMI 的一条 SYNC 会替换当前屏幕,字幕消失也需要一条指令。产物因此在每条之后写一个 <P> 把屏幕清空,否则上一条会一直留在画面上。
SSA 转 SMI 后,时间值是怎么写的?
写成整数毫秒的 Start 值。SSA 的 0:00:04.13 是 4130 毫秒,产物写 Start=4130,既不四舍五入也不平移。
SSA 转 SMI 后,卡拉OK 计时去哪了?
计时没了,字还在。\k、\kf、\ko 标记的是每个音节什么时候亮;SMI 记不了一行内部的时刻,标记被去掉,音节作为普通文字进入 <P>。
SSA 转 SMI 后,[Script Info] 和 Comment: 行呢?
都不会过去。只有 Dialogue: 行变成字幕;[Script Info](包括标题)、样式表、Comment: 行,以及 [Fonts]/[Graphics] 里内嵌的内容全部丢掉。
SSA 转 SMI 后,一条两行字幕怎么放?
放在同一个 <P> 里,两行之间用 <br>,这是 SAMI 的硬换行写法;仍然是一条字幕,一起显示。