code_next吧 关注:1,988贴子:3,999
  • 12回复贴,共1

【教程】【SSA字幕制作教程】

只看楼主收藏回复

SSA动态字幕。
相比于Srt字幕而言,SSA字幕的体积更大、编码更为复杂。
但是同时能做出更好的效果。
例如,如果想同时显示多个字幕,对于Srt来说可能是一件非常困难的事情,但是对于SSA字幕来说却是非常简单。
就如下图所示:

这是《Black Cat》片头部分。字体为“华文中宋”。同时还在对角上显示了两行字幕。
当然SSA字幕不仅仅局限于此。
对于动漫的片头曲,相信很多人都想做出类似卡OK效果来,同样对于SSA字幕来说,也能轻松完成。
如下图所示:

这是《To LOVEる》第二季的片头曲,白色字体,粉色边缘虚化。
随片头曲播放,字幕会随着歌词逐字缩放显示。
对于SSA的介绍就到这里,下面开始详细的讲述字幕代码的编写。


1楼2014-09-23 21:40回复
    首先,先让大家看一段字幕的代码。

    这是EVA TV版 02话的部分字幕。
    经过观察,我们可以按照空行将代码分为三个部分。
    即:
    [Script Info]
    。。。。。
    [V4 Styles]
    。。。。。
    [Events]
    。。。。。
    这三个部分都是"[....]"开头,是SSA字幕通用的部分。
    也就是说每个合法的SSA字幕都是由这三部分组成的。(有些地方可以省略)
    下面开始逐一介绍这三个部分的组成。


    IP属地:北京3楼2014-09-23 21:56
    回复
      2025-06-10 19:28:25
      广告
      [Script Info]------------------------脚本信息
      Title: --------------------------------字幕名字
      Original Script: -------------------制作字幕的团体名字
      Original Translation:-------------校正人员
      Original Timing:------------------ 时间轴人员
      Synch Point:0
      ScriptType:v4.00-----------------SSA字幕的脚本类型
      Collisions:Normal
      PlayResX:-------------------------影片X轴像素
      PlayResY:-------------------------影片Y轴像素
      PlayDepth:
      Timer:100.0000 ----------------- 这个是字幕设置精确到的时间
      WrapStyle:1
      这个部分根据不同的播放器,所能识别的部分也是不同的。
      上述部分是常见的编码。
      实际上,这个部分就算你不写对于播放器而言,也基本没有什么影响。
      例如下面这段代码:

      使用Mplayer X(OS X)播放效果如下:

      播放器从[V4 Styles]获取字体、从[Events]获取字幕信息。
      所以[Script Info]可以全部省略不写。
      下面说[Script Info]中几个比较重要的参数:
      1.
      ScriptType:v4.00-----------------SSA字幕的脚本类
      如果是SSA字幕,写的就是v4.00
      如果是ASS字幕,写的就是v4.00+
      如果用C语做类比的话,类似于include部分
      对于SSA、ASS字幕的格式其实也没有太严格的要求,二者就像C和C++的关系一样。
      有些播放器对SSA里面参杂的ASS代码也能识别,有些则不能。
      具体字幕效果还是要看具体的播放器和字体包。
      2.
      PlayResX:-------------------------影片X轴像素
      PlayResY:-------------------------影片Y轴像素
      这个定义了影片的尺寸。
      例如:
      PlayResX:1920
      PlayResY:1080
      这个影片就是1080P的。
      字体的大小也是以这个为参考的。
      例如:
      PlayResX:1920 PlayResX:640
      PlayResY:1080 PlayResY:360
      字号:60 字号:60
      同样在一个1080P的影片上载入。后者的字体会显得大的多。
      因为播放器将640x360像素扩大到1920x1080。字体也进行了相应的缩放。
      3.
      Timer:100.0000 ----------------- 这个是字幕设置精确到的时间
      一般写100.00就足够了。
      字幕一般精确到1/100秒就难以分辨了。
      外加ssa很多动画效果可以将字幕显示的时间模糊。
      不像Srt那样必须非常精确的显示到具体的时间。


      IP属地:北京5楼2014-09-23 22:43
      回复
        [V4 Styles]部分介绍
        对于这个部分,我们还是先看一个代码。
        [V4 Styles]
        Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding
        Style: Default,Default,22,&HFFFFFF,&H00FFFF,&H000000,&H000000,0,0,1,2,0,2,20,20,32,20,1
        [v4 Styles]-------------这一个是对字幕总体属性的定义(SSA)
        如果是SSA字幕一般写为v4 Styles,如果是ASS字幕则是v4+ Styles
        Format ------------------说明个参数的格式【Style】
        Name---------------------给字幕字体定义的名字名字【Default】
        Fontname----------------字体名称【Default】
        Fontsize------------------字体大小【22】
        PrimaryColour-----------主字幕色 ------字幕的主要颜色
        SecondaryColour-------次字幕色-------卡拉OK中变为的颜色
        TertiaryColour-----------字幕边框颜色
        BackColour--------------字幕阴影颜色
        颜色部分显示格式为:&H<B><G><R>
        <B>、<G>、<R>均为两位16进制数,
        例如:&H969696、&HFF0000等等
        为了做出和影片本身颜色一样的字幕,我们可以借助一些图形处理工具,例如PhotoShop等
        来读取字体的颜色

        使用PS里面的吸管工具吸取颜色,如右上角显示RGB为154、154、155.
        然后换算成16进制即可。
        特别注意一下,颜色代码中&H后面的BGR顺序,即:蓝色、绿色、红色。


        IP属地:北京6楼2014-09-24 11:48
        回复
          Bold:-----------------粗体 0为关闭,-1为开启
          Italic:-----------------斜体 0为关闭,-1为开启
          BorderStyle:-------字幕显示方式:1是字幕+围边,3是不透明显示
          Outline:--------------边框颜色的初细可以从0-4设置
          Shadow:-------------阴影颜色的初细可以从0-4设置
          Alignment:----------字幕出现的位置

          这几个部分的代码数据,根据不同播放器有不同的效果。
          上述所写的只是常见情况。在整体语法讲完后,会详细分析这些数据的。
          MarginL MarginR-------字幕距左右两边的距离,分别在右对齐,左对齐,时无效
          MarginV-------------------字幕高度 下对齐时表示到底部的距离,上对齐时表示到顶部的距离
          中对齐时无效
          AlphaLevel:------------字幕的Alpha值,就是字幕的透明度,可以在0-255之取值间
          0为不透明255为完全透明
          Encoding:--------------字幕字体的编码方式
          134=GB2312(简体中文)
          136=CHINESEBIG5(繁体中文)
          1=DEFAULT(字幕自己选择)
          一般写1就行了
          对于[v4 Styles]这个部分,可以说主要是用来定义字体。
          如果系统或播放器,不含有这个字体的话,对于中文来说放出来的效果就大多数就是宋体。
          再比如说,有些文字没有这个字体,显示出来的话就会非常别扭,影响整体字幕的效果。
          这点要特别注意。


          IP属地:北京7楼2014-09-24 12:05
          回复
            [Events] 事件部分(SSA)
            对于这个部分的讲解,我们也是先看一段代码。
            (这是Another 00话的部分)
            [Events]
            Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
            Dialogue: 0,0:00:20.44,0:00:21.78,CH,,0000,0000,0000,,嘿,你有空吗?
            Dialogue: 0,0:00:22.37,0:00:23.63,CH,,0000,0000,0000,,去哪儿玩玩吧
            Dialogue: 0,0:00:30.47,0:00:32.08,CH,,0000,0000,0000,,你知道分身吗?
            Dialogue: 0,0:00:33.26,0:00:34.13,CH,,0000,0000,0000,,分身?
            Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV,Effect, Text
            Marked 标记符号 Marked=0为未标记. Marked=1为已标记.
            直接写数字或者写“Marked=0”都可以。
            时间轴部分:
            Start 开始时间-------格式0,0:00:00.00------- 最小单位1/100秒
            End 结束时间 -------格式0,0:00:00.00-------最小单位1/100秒
            字体调用部分:
            Style -------字体名称
            Name -------字幕名字和上面的[v4 Styles]设置相对应
            MarginL,MarginR,MarginV ------- 和[v4 Styles]一样
            Effect------- 显示的方式
            Scroll up;A;B;X;Y -----------字幕从下向上移动
            A和B代表Y轴座标(可缺省),X是速度,Y是字幕在萤幕边缘的透明度(可缺省)
            比如Scrollup;100;10;20
            Scroll down;A;B;X;Y -------字幕从上向下移动
            A和B代表Y轴座标(可缺省),X是速度,Y是字幕在萤幕边缘的透明度(可缺省)
            Banner;X;0:Y-------------字幕横向移动
            X是速度,0代表右->左,1代表左->右 ,Y是字幕在萤幕边缘的透明度(可缺省)
            Text 字幕正文------- 字幕正文
            正文部分同时也是插放特性代码的部分。
            对于字幕的特效代码,随后会跟着几个例子进行详细的讲解


            IP属地:北京8楼2014-09-24 15:55
            回复
              nice辛苦辛苦


              IP属地:北京来自Android客户端9楼2014-09-28 10:10
              回复
                在介绍特效代码前先说SSA、ASS里面的几个特殊字符:
                \n
                作用:空格,宽度超出范围后自动换行
                例:
                Dialogue: 0,0:00:06.93,0:00:11.39,*Default,NTP,0000,0000,0000,,听说那个男的拿著的\n大黑蛋裏面有人偶
                (字号30)

                (字号60)

                (影片:壳ノ少女 动漫版)
                从上述例子可以看出:“听说那个男的拿著的\n大黑蛋裏面有人偶”
                \n在屏幕足够显示整行字幕时为空格,单行长度不足时显示为换行符。
                \N 硬回车(强制换行)
                例:
                Dialogue: 0,0:00:06.93,0:00:11.39,*Default,NTP,0000,0000,0000,,听说那个男的拿著的\N大黑蛋裏面有人偶
                (字号30)

                当字幕中遇到“\N”时,无条件产生换行。
                \h 硬空格(强制空格)
                例:
                Dialogue: 0,0:00:06.93,0:00:11.39,*Default,NTP,0000,0000,0000,,听说那个男的拿著的\h大黑蛋裏面有人偶
                (字号60)

                当字幕中遇到\h时,无条件的产生一个空格。
                PS:
                针对不同播放器而言,换行效果是不同的。
                例如QQplayer里面,当字幕超出屏幕范围时,会自动换行。
                而MplayerX则不会。对于文字较多的字幕而言,换行就是十分必要的了。
                同时,由于播放器可以调整字幕字体的大小,使得原本可以单行显示出来的字幕变得空间不足。
                这样设置自动换行就十分有必要了。


                10楼2014-10-20 08:46
                回复
                  2025-06-10 19:22:25
                  广告
                  下面开始介绍SSA字幕的特效代码:
                  因为这些特效代码执行了一定的功能,暂且就称之为函数吧。
                  函数的格式有以下这两种:
                  {\函数名称(参数1,参数2,......)}
                  {\函数名称 参数1 参数2.....}
                  下面我们跟随几个例子,来了解一下SSA的特效
                  例1:
                  Dialogue: 0,0:00:15.01,0:00:21.56,opjp,,0000,0000,0000,,{\pos(10,25)}{\t(0,100,\blur10\fs36)}{\t(100,200,\blur10\fs18)}不{\r}
                  Dialogue: 0,0:00:15.21,0:00:21.56,opjp,,0000,0000,0000,,{\pos(30,25)}{\t(0,100,\blur10\fs36)}{\t(100,200,\blur10\fs18)}机{\r}
                  Dialogue: 0,0:00:15.41,0:00:21.56,opjp,,0000,0000,0000,,{\pos(50,25)}{\t(0,100,\blur10\fs36)}{\t(100,200,\blur10\fs18)}嫌{\r}
                  Dialogue: 0,0:00:15.61,0:00:21.56,opjp,,0000,0000,0000,,{\pos(70,25)}{\t(0,100,\blur10\fs36)}{\t(100,900,\blur10\fs18)}な{\r}
                  Dialogue: 0,0:00:17.41,0:00:21.56,opjp,,0000,0000,0000,,{\pos(90,25)}{\t(0,100,\blur10\fs36)}{\t(100,200,\blur10\fs18)}天{\r}
                  Dialogue: 0,0:00:17.61,0:00:21.56,opjp,,0000,0000,0000,,{\pos(110,25)}{\t(0,100,\blur10\fs36)}{\t(100,200,\blur10\fs18)}気{\r}
                  Dialogue: 0,0:00:17.81,0:00:21.56,opjp,,0000,0000,0000,,{\pos(130,25)}{\t(0,100,\blur10\fs36)}{\t(100,200,\blur10\fs18)}模{\r}
                  Dialogue: 0,0:00:18.01,0:00:21.56,opjp,,0000,0000,0000,,{\pos(150,25)}{\t(0,100,\blur10\fs36)}{\t(100,200,\blur10\fs18)}様{\r}
                  Dialogue: 0,0:00:18.21,0:00:21.56,opjp,,0000,0000,0000,,{\pos(170,25)}{\t(0,100,\blur10\fs36)}{\t(100,800,\blur10\fs18)}が{\r}
                  Dialogue: 0,0:00:19.21,0:00:21.56,opjp,,0000,0000,0000,,{\pos(190,25)}{\t(0,100,\blur10\fs36)}{\t(100,200,\blur10\fs18)}乗{\r}
                  Dialogue: 0,0:00:19.41,0:00:21.56,opjp,,0000,0000,0000,,{\pos(210,25)}{\t(0,100,\blur10\fs36)}{\t(100,200,\blur10\fs18)}り{\r}
                  Dialogue: 0,0:00:19.61,0:00:21.56,opjp,,0000,0000,0000,,{\pos(230,25)}{\t(0,100,\blur10\fs36)}{\t(100,200,\blur10\fs18)}移{\r}
                  Dialogue: 0,0:00:19.81,0:00:21.56,opjp,,0000,0000,0000,,{\pos(250,25)}{\t(0,100,\blur10\fs36)}{\t(100,400,\blur10\fs18)}っ{\r}
                  Dialogue: 0,0:00:20.21,0:00:21.56,opjp,,0000,0000,0000,,{\pos(270,25)}{\t(0,100,\blur10\fs36)}{\t(100,200,\blur10\fs18)}て{\r}
                  Dialogue: 0,0:00:20.41,0:00:21.56,opjp,,0000,0000,0000,,{\pos(290,25)}{\t(0,100,\blur10\fs36)}{\t(100,200,\blur10\fs18)}た{\r}
                  Dialogue: 0,0:00:20.61,0:00:21.56,opjp,,0000,0000,0000,,{\pos(310,25)}{\t(0,100,\blur10\fs36)}{\t(100,200,\blur10\fs18)}ア{\r}
                  Dialogue: 0,0:00:20.81,0:00:21.56,opjp,,0000,0000,0000,,{\pos(330,25)}{\t(0,100,\blur10\fs36)}{\t(100,200,\blur10\fs18)}イ{\r}
                  Dialogue: 0,0:00:21.01,0:00:21.56,opjp,,0000,0000,0000,,{\pos(350,25)}{\t(0,100,\blur10\fs36)}{\t(100,200,\blur10\fs18)}ツ{\r}
                  Dialogue: 0,0:00:15.01,0:00:21.56,opcn,,0000,0000,0000,,{\blur20\fad(100,100)}{\move(10,350,630,350,0,300)}被坏天气所影响的那家伙
                  截图:

                  影片16秒
                  从上面的编码信息,我们可以看出16s时,应该显示的字幕为:
                  {\pos(70,25)}{\t(0,100,\blur10\fs36)}{\t(100,900,\blur10\fs18)}な{\r}
                  我们可以分解出:
                  {\pos(70,25)}
                  {\t(0,100,\blur10\fs36)}
                  {\t(100,90,\blur10\fs18)}
                  {\r}
                  这几个函数
                  下面我们来逐一的解释一下这些函数的作用。
                  1、{\pos(x,y)}
                  这个函数的作用就是定位字幕显示的位置。
                  里面的两个参数依次是视频的X坐标、Y坐标。
                  在最前面的脚本信息,我们定义了视频的尺寸,这个定位也是以脚部尺寸为参照定位的。
                  X、Y的坐标可以超过脚本的定义范围。
                  注意:对于一整行字幕,进行定位时,还要参考字幕的显示方式。
                  例如:


                  上图字幕显示定位都(424,450)
                  第一张是居中显示字幕:定位坐标在整个字幕中间。
                  第二张是左对齐显示:定位坐标在整个字幕左边。
                  其他显示方式依次类推。
                  有些时候,字幕显示定位觉得计算坐标比较复杂
                  也有简易定位的方法:
                  例如将{\pos(x,y)}换成{\a1}
                  字幕效果将变成这样:
                  {\a1}

                  {\a2}

                  {\a3}

                  屏幕字幕显示位置可以有9种。
                  下面给出{\a<n>},不同的数值显示的方式:
                  SSA字幕:
                  5 6 7
                  9 10 1
                  1 2 3
                  ASS字幕:
                  7 8 9
                  4 5 6
                  1 2 3
                  对于不同播放器识别的数字效果可能不同,同时SSA编码、ASS编码识别效果也是不同的。
                  一般1、2、3这三个基本是通用的。其他的代码只能看播放器的兼容性了。


                  12楼2014-10-22 12:25
                  回复
                    2、{\t(t1,t2,f(x))}
                    {\t(0,100,\blur10\fs36)}
                    {\t(100,900,\blur10\fs18)}
                    这两个代码都属于{\t(t1,t2,f(x))}这种形式。
                    \t 是SSA、ASS字幕的动画部分。
                    {\t(t1,t2,f(x))}这行语句表示:从t1到时间t2,完成f(x)这个动画。
                    {\t(0,100,\blur10\fs36)}:从时间0到时间100,做\blur10和\fs36这两个特效。
                    \blur10 :这个是边缘模糊,如果没有边缘的话,就是做整体的模糊。
                    字幕中粉色的边缘虚化,用的就是这个代码。(QQplayer无此特效)
                    \fs36 :这个是设定字体大小为36号。
                    前面我们定义的字体大小为18号,等于说字体变大了一倍。
                    {\t(100,900,\blur10\fs18)}:这句中,\fs18等于说再次将字体变为18号。
                    动画连续起来,出现的就是先变大后缩小的效果了。
                    3、{\r}
                    \r可以撤销上一个特效。
                    在这里是没有什么实际意义的,仅仅是为了代码工整而写上的。
                    一句字幕,可以写在一行里面,也可以分成多行,然后用定位的方法进行连接。
                    上述的这个字幕就是一行只有一个字,然后拼接在一起。
                    下面我们看一个写在一行里面的例子。


                    13楼2014-11-09 09:25
                    回复
                      磨砂雪剪辑《残酷的天使纲领》MTV

                      影片4秒
                      这行字幕的代码如下:
                      Dialogue: Marked=0,0:00:02.21,0:00:07.41,JPN,,0000,0000,0000,,
                      {\pos(20,38)}
                      {\t(0,1000,\3c&H0000FF&)}残{\r}
                      {\t(1000,2200,\3c&H0000FF&)}酷{\r}
                      {\t(2200,2700,\3c&H0000FF&)}な{\r}
                      {\t(2700,3200,\3c&H0000FF&)}天{\r}
                      {\t(3200,3600,\3c&H0000FF&)}使{\r}
                      {\t(3600,4000,\3c&H0000FF&)}の{\r}
                      {\t(4000,4400,\3c&H0000FF&)}よ{\r}
                      {\t(4400,4800,\3c&H0000FF&)}う{\r}
                      {\t(4800,5200,\3c&H0000FF&)}に{\r}
                      Dialogue: Marked=0,0:00:02.21,0:00:07.41,BGS,,0000,0000,0000,,
                      {\pos(40,15)}
                      {\t(0,500,\3c&H0000FF&)}ざ{\r}
                      {\t(500,1000,\3c&H0000FF&)}ん{\r}
                      {\t(1000,1600,\3c&H0000FF&)}こ{\r}
                      {\t(1600,2200,\3c&H0000FF&)}く{\r}
                      Dialogue: Marked=0,0:00:02.21,0:00:07.41,BGS,,0000,0000,0000,,
                      {\pos(95,15)}
                      {\t(2700,3000,\3c&H0000FF&)}て{\r}
                      {\t(3000,3200,\3c&H0000FF&)}ん{\r}
                      {\t(3200,3600,\3c&H0000FF&)}し{\r}
                      这其实是三句字幕分别由三个Dialogue开始,为了我们阅读方便,我进行了换行处理。
                      图中字幕的效果是:随歌词播放,字体颜色进行改变。
                      我们知道:
                      \pos是定位,\t是在一定时间内做特性。
                      既然是字体颜色改变的函数,那一定是:\3c&H0000FF&这句了。
                      格式:\3c&H<BGR>&
                      <BGR>表示十六进制颜色,这里写的的0000FF也就是R的值为FF,其余均为0,也就是纯红色。
                      \3c&H<BGR>&是改变边框颜色,而不是主字体。
                      同类的函数还有:
                      \c&H<bbggrr>&
                      \1c&H<bbggrr>& 这两个都是改变主字幕颜色
                      \2c&H<bbggrr>& 改变次要颜色
                      \3c&H<bbggrr>& 改变边框颜色
                      \4c&H<bbggrr>& 改变阴影颜色


                      14楼2014-11-09 09:43
                      回复
                        上述字幕的效果其实就模仿卡OK的效果。
                        在前面定义字体时,我们提到一个SecondaryColour参数,也就是卡OK的过渡颜色。
                        在ASS字幕中,提供了一个{\K<t>}的函数,可以非常便捷的实现卡OK效果。
                        下面我们来看一个例子:

                        (影片26分8秒)
                        代码如下:
                        Dialogue: 0,0:26:08.40,0:26:10.11,jped,,0000,0000,0000,,{\move(900,75,962,75)}{\r\K20}震{\r\K20}え{\r\K60}届{\r\K30}く{\r\K20}风
                        Dialogue: 0,0:26:08.40,0:26:10.11,cned,,0000,0000,0000,,{\move(962,1060,900,1060)}{\K150}颤抖而至的寒风
                        刨除时间轴后:
                        {\move(900,75,962,75)}{\r\K20}震{\r\K20}え{\r\K60}届{\r\K30}く{\r\K20}风
                        {\move(962,1060,900,1060)}{\K150}颤抖而至的寒风
                        对于一个卡OK的变换效果,简单是使用{\K<t>}这样一个函数就可轻松实现。
                        1.{\move(x1,y1,x2,y2)}
                        表示在Dialogue:t1,t2
                        t1-t2的时间内,字幕由(x1,y1)移动到(x2,y2)
                        在这里我的是一个摆动效果。即:日语字幕与中文字幕朝反方向移动,做出摆动。
                        2.{\K<t>}
                        表示在字幕开始时间t1到t1+t的时间内完成卡OK效果。
                        \K函数使用的是相对时间。
                        也就是说:
                        {\r\K20}震{\r\K20}え{\r\K60}届{\r\K30}く{\r\K20}风
                        这句字幕,每个字开始的时间为:
                        0 震
                        20 え
                        40 届
                        100 く
                        130 风
                        结束时间为150
                        当字幕过度需要空闲时,也需要多加一个{\k<t>}来填补t时间的空白
                        例如:
                        {\K20}A{\K20}{\K30}B
                        A的开始时间为0,持续时间为20
                        B的开始时间为20+20,持续时间为30
                        在{\K150}颤抖而至的寒风
                        这句中,则是将整句话做一个卡OK效果。时间为150。均匀的扫过每个字。


                        IP属地:北京16楼2015-02-23 01:29
                        回复
                          感谢


                          IP属地:江苏19楼2024-11-24 13:30
                          回复