本文简单地介绍了常见媒体字幕的形式,以及字体子集化在跨平台媒体播放里的作用

字幕格式

字幕(Subtitle)作为辅助观影的工具,广泛存在于我们身边。下面介绍几种本地媒体中常见的字幕格式及其特点:

它们分别是 .sub.srt.ass.pgs 格式的字幕

SUB 格式的字幕常用于 DVD 中,这里不过多介绍,只需要了解 SUB 格式的字幕显示的是实际的文本字幕,而并非图片字幕

SRT 格式(Subripper)是最简单的文本字幕格式,扩展名为.srt,其组成为:一行字幕序号,一行时间代码,一行字幕数据 如:

45
00:02:52,184 --> 00:02:53,617
慢慢来

这表示:第45个字幕,显示时间从该影片开始的第2分52.184秒到第2分53.617秒,内容为“慢慢来”$^1$ SRT 格式作为最简单的文本字幕,得到了广泛的应用,相比于 ASS 格式兼容性更佳,绝大多数媒体播放器都支持 SRT 格式

ASS 格式(Advanced SubStation Alpha)采用 SSA V4+ 脚本语言编写,可以实现更高级的字幕效果,比如自定义字体大小,样式;实现字幕渐入渐出;和卡拉 OK 一样的字幕颜色加载等等 ASS 字幕一般在头部定义需要使用到的字幕的字体样式,例如定义字幕样式 Default 并在后续时间轴中调用该格式 ASS 格式可以高度自定义,显示效果出众,成为了不少字幕组的选择;但并非所有播放器都能很好的支持;也会遇到缺失字体而导致字幕不协调的问题

PGS 格式(Presentation Graphic Stream)字幕一般用于成熟的电影行业,是一种将图片字幕单独分离出来的格式。这种格式的好处在于不会对原片造成损失,分离的形式使不同语言的字幕可以切换,图片流形式又可以保证在不同播放器上的兼容性,无需依赖字体

字幕加载形式

字幕文件有不同的存在形式:

内嵌字幕又叫烧录字幕,国内流媒体视频网站中的字幕大多是内嵌字幕,它的原理是将字幕字体烧录到视频上,使字体成为视频的像素点。这种烧录是有损的,会使原视频被字幕遮挡的部分损失 当然,由于字幕和视频转化为了“新的包含字幕的视频”,新视频不存在兼容性问题,播放器在播放时无需调用字幕,只需要播放新视频即可

内封字幕是指将上述介绍的字幕格式文件封装在视频文件中,字幕和视频只有一个文件(如 video.mkv ),字幕是独立于视频存在的。内封字幕视频的字幕文件可以被简单地提取出来,也可以对字幕修改后重新封装回原视频

外挂字幕是指字幕文件独立于视频文件,在播放时由播放器挂载到视频上。如同一级目录下包含 video.mkvsubtitle.ass 格式的文件。外挂字幕便于修改,但需要播放器支持挂载字幕

字幕字体子集化

字体文件通常包含了所有的字符字体,这使得字体文件较大,字体子集化可以将需要使用的字符的字体单独提取出来,以供调用

这非常容易理解,我们不妨打个比方: 您需要前往后院拧紧栅栏上的螺丝,栅栏上有十字螺丝和梅花螺丝,于是你从工具箱拿了一把十字螺丝刀和梅花螺丝刀,并前往后院修理螺丝 在这个例子里,工具箱就是字体文件,而十字螺丝刀和梅花螺丝刀就是我们字体子集化后的文件,我们需要多少字符的字体,就子集化多少字符的字体,因为这样可以节省空间

相信聪明的你已经理解了什么是字体子集化,我们在上文提及到

ASS 格式可以高度自定义,显示效果出众,成为了不少字幕组的选择 ASS 格式的字幕会遇到缺失字体而导致字幕不协调的问题

缺失的字体在电脑端可以通过安装对应字体文件解决,但对于移动设备(例如封闭的 iOS)、电视设备,安装每一种对应的字体文件几乎不太现实

于是为了以一种通用的方法解决观影过程中字体缺失造成的问题,我们将字体子集化引入到 .ass 文件中,使得任何可以支持 .ass 字幕的播放设备都可以正确地显示字幕效果而无需安装额外的字体文件;同时,对于透过串流在不同设备播放媒体时,每一个设备都可以正确的显示相同的字幕效果,可谓一劳永逸

我们来看看字体子集化后的字幕文件开头

fontname: 方正正准黑_GBK[0]_subset_0.ttf
!!%!!!!2!1!!"!!12V.61CPR,(]!!!*5!!!!IE^4,T*..F:&!!!"`!!!!&:D<7&Q,5(\&!!!*UQ!!"<-
9X:U)!!6!!!!!!%=!!!!!G:Q:WVF[3#:!!!#_!!!!;&H98.Q!"]!#1!!!3Q!!!!1:WRZ:LUG#2-!!$Y9
!!,B>'BF974Y)7I-!!!"R!!!!$:I;'6B!@-"*Q!!!8Q!!!!E;'VU?'"1*^M!!![1!!!)PGRP9W%&@\QQ
!!!85!!!$`RN98BQ"DQ#O1!!!4Q!!!!A<G&N:5X>H6M!!!3=!!!"^("P=X4`P1!-!!!"8!!!!#"Q=G6Q
+!)$01!!!3!!!!!->GBF91'$!)%!!!'A!!!!*(:N>(AI0S?R!!!'E!!!"`Y!&1!!O!!#+\A"`Y7Y!!'.
!!!!!Q!)!!)!'!!"``]!!Q!"!!!$`A%7!$%!!!!!!!)!!!!!!!Q!!!)!!;%!!!!!!!-!!!!!!!$`OA!-

第二行后的乱码内容都是描述字体子集化后的字体文件,这样我们便将需要使用的字体文件写入到字幕文件中了

Infuse 中的效果如下图 可以发现字幕的颜色、字体都显示正确,没有出现回落到默认字体的情况

字幕子集化工具有 MkvAutoSubset 和一些其他的 GUI 工具,都可以很方便的将字幕字体子集化

注释:

  1. 摘自维基百科