SSA動態字幕教學



常常在看影片時會看到一些翻來轉去蠻炫的特效,這到底是怎麼做到的呢?經過一段時間的瞭解發現原來關鍵就是SSA字幕.
以下是個人將這段時間所瞭解的心得做一番整理,對初學者而言也算是一個教學,大部份的內容都是基本功,至於能產生什麼樣的變化就靠各位的想像力去發揮了.

===============================================

A. SAA字幕的介紹 :

  SSA(Sub Station Alpha)和常見的SRT(SubRip)一樣都是文字檔(Text file),雖然有專用的軟體編輯,但也可以使用[記事本]編輯.
  SRT單純的只存放字幕,樣式則來自vobsub的設定,如果加上.style檔案的話可以讓SRT字幕有多種樣式,但整體而言SRT的花樣仍比不上SSA.
  註 : 樣式(Style)是一種把字幕呈現的各種靜態屬性搭在一起的集合體,內容包括 字型,大小,主要顏色,次要顏色,外框顏色,陰影顏色,...等,你可用Vobsub的SubResync開啟SRT或SSA字幕檔,再按[Edit]就可看到字幕呈現的各種靜態屬性.

SSA4.0字幕檔的架構 :
  SSA4.0的架構大致分為 [Script Info], [V4 Styles] 和 [Events] 三部份.
一. [Script Info] : 描述這個SSA檔案的基本資料,其中比較重要的是 PlayResX 和 PlayResY ,其餘的用預設值即可.
PlayResX 和 PlayResY 代表這個SSA字幕的最大縱(PlayResY)橫(PlayResX)座標,一般就是這個SSA字幕所搭配影片的解析度,你可用Avicodec開啟影片,解析度是視訊的其中一個資訊.
下面將會提到的\pos, \move等和位置有關的功能都不要超出這兩個座標值.

http://avicodec.duby.info/ftp/AVIcod11.exe

二. [V4 Styles] : SSA字幕所用到全部的樣式(Style)都必須在此宣告.這部份可用Vobsub的SubResync開啟SRT或SSA字幕檔,先點選一行台詞再按[Edit]修改Style的Name和編輯你要的各種靜態屬性,存檔時記得[Unicode output]要打勾,[存檔類型]選"Sub Station Alpha"就會產生一個新的樣式.再用[記事本]把整行新的樣式複製到你要製作的SSA字幕中使用.
  Name : 樣式的名字
  Fontname : 字型的名字
  Fontsize : 字型的大小
  PrimaryColour : 主要顏色
  SecondaryColour : 次要顏色
  TertiaryColour : 外框顏色
  BackColour : 陰影顏色  
  Outline : 外框大小
  Shadow : 陰影大小
  Alignment : 字幕的位置
  MarginL : 左邊界
  MarginR : 右邊界
  MarginV : 下邊界
  Encoding : 字型的編碼代號, 136代表繁體中文, 134代表簡體中文.

三. [Events] : 所有的特效都放在這裡.
  Start : 字幕出現的時間
  End : 字幕結束的時間
  Style : 在[V4 Styles]裡定義過的樣式名字, 例如後面的例子裡的Default和redx, 在Dialogue的樣式可填這些名字.
  註 : Default是一個SSA字幕裡的預設樣式名字.如果你填了一個不存在[V4 Styles]的樣式名字,系統會自動轉為Default這個樣式.
  MarginL : 左邊界, 0表示和樣式的MarginL相同
  MarginR : 右邊界, 0表示和樣式的MarginR相同
  MarginV : 下邊界, 0表示和樣式的MarginV相同
  Effect : 特效, 有Banner 和 Scroll up/Scroll down兩種特效
  Text : 字幕的文字和特效代碼

四. 各種特效代碼和範例 :
  測試下面的範例時, 必須在[V4 Styles]內加上這一行,等熟悉後再自行修改其中的數值.
  Style: redx,標楷體,24,&Hdcdc23,&Hdd9ce2,&Hffffff,&Hffffff,0,0,1,2,1,2,20,20,20,0,136

a. Effect的特效 :

  Banner;delay[;lefttoright;fadeawaywidth] : 跑馬燈
         delay : 移動速度, 數值愈大移動愈慢
         lefttoright : 移動方向, "0"表示從右向左移動,"1"表示從左向右移動
         fadeawaywidth : 字幕進出畫面左右邊的距離, 數值愈小愈早進愈慢出.
  範例 :
  Dialogue: Marked=0,0:00:03.55,0:01:05.90,redx,,0000,0000,0000,Banner;50;00;100,{\pos(180,040)}{\3a&H8F&}{\4c&98FFFF&}☆◎本示範由redx製作◎☆

  Scroll up;y1;y2;delay[;fadeawayheight] : 向上捲動
  Scroll down;y1;y2;delay[;fadeawayheight] : 向下捲動
         y1 : 字幕出現的縱座標.
         y2 : 字幕消失的縱座標.
         delay : 移動速度, 數值愈大移動愈慢
         fadeawayheight : 字幕進出畫面上下邊的距離, 數值愈小愈早進愈慢出.
  範例 :
  Dialogue: Marked=0,0:00:03.55,0:01:05.90,redx,,0000,0000,0000,Scroll up;100;200;100,{\pos(100,60)}redx製作


b. 和文字本身相關的特效代碼:

  \N : 直接換行, 可造成垂直字幕的效果
  範例 :
  Dialogue: Marked=0,0:00:01.66,0:00:03.33,Default,,0000,0000,0000,,第\N二\N行\N台\N詞

  \bord<width> : 外框大小,width數值愈大邊框愈大
  範例 :
  Dialogue: Marked=0,0:00:01.35,0:00:25.34,Default,,0000,0000,0000,,{\bord6}{\pos(130,90)}redx製作

  \shad<depth> : 陰影大小,depth數值愈大陰影愈大
  範例 :
  Dialogue: Marked=0,0:00:01.35,0:00:24.34,Default,,0000,0000,0000,,{\shad6}{\pos(130,110)}redx製作

  \fn<font name> : 字型
  範例 :
  Dialogue: Marked=0,0:00:01.35,0:00:25.34,Default,,0000,0000,0000,,{\fn標楷體}{\pos(130,60)}redx製作

  \fs<font size> : 字型大小
  範例 :
  Dialogue: Marked=0,0:00:01.35,0:00:25.34,Default,,0000,0000,0000,,{\fs24}{\pos(130,60)}redx製作

  \fsc<x or y><percent> : 字型依比例放大縮小,x代表橫向. y代表縱向.
  範例 :
  Dialogue: Marked=0,0:00:02.00,0:00:16.50,Default,,0000,0000,0000,,{\pos(160,250)}{\fscx200%}{\fscy600%}橫向2倍縱向6倍字

  \fsp<pixels> : 字距
  範例 :
  Dialogue: Marked=0,0:00:01.35,0:00:25.34,Default,,0000,0000,0000,,{\fsp10}{\pos(130,60)}redx製作

  \fr[<x/y/z>]<degrees> : 字幕繞x/y/z軸旋轉degrees的度數
  範例 :
  Dialogue: Marked=0,0:00:01.35,0:00:25.34,Default,,0000,0000,0000,,{\frz20}{\pos(130,60)}redx製作

  \k<duration> : 卡拉OK, 顏色變化以style為準, 剛出現的時候是次要顏色,依duration長短改變成主要顏色.
       duration : 變色時間(單位 : 百分之一秒)
       \k<duration> 瞬間改變文字顏色
       \kf<duration> 或 \K<duration> 由左至右漸漸改變文字顏色
       \ko<duration> 無外框改變文字顏色
  範例 :
  Dialogue: Marked=0,0:00:10.10,0:02:15.10,Default,,0000,0000,0000,,{\K100}本{\K150}示範{\K50}由{\K150}redx{\K100}製作

  \c&H<BBGGRR>& : 字幕顏色, BB(藍色)(0~FF), GG(綠色)(0~FF), RR(紅色)(0~FF)
  \1c : 主要顏色
  \2c : 次要顏色
  \3c : 外框顏色
  \4c ; 陰影顏色
     十六進位顏色代碼  http://www.ligvs.cy.edu.tw/color_code.htm (採RRGGBB排列,所以要自行轉成BBGGRR)
  範例 :
  Dialogue: Marked=0,0:00:5.30,0:00:10.00,Default,,0000,0000,0000,,{\pos(90,160)}{\fs24}{\c&H8700FF&\t(1,\c&H22FF5F&}紅色變綠色

  \a&H<XX>& : 透明度(0~FF),數值愈大愈透明
  \1a : 主要顏色透明度
  \2a : 次要顏色透明度
  \3a : 外框顏色透明度
  \4a ; 陰影顏色透明度
  範例 :
  Dialogue: Marked=0,0:00:5.55,0:02:05.90,redx,,0000,0000,0000,,{\pos(200,160)}{\3a&H7F&}redx製作


c. 和位置/時間相關的特效代碼 :

  \pos(<X>, <Y>) : 字幕位置的座標, X代表橫座標,"0"表示最左方. Y代表縱座標,"0"表示最上方.
                註 : 橫座標對 "Banner" 無效.
  範例 :
  Dialogue: Marked=0,0:00:01.35,0:00:24.34,Default,,0000,0000,0000,,{\pos(130,110)}redx製作

  \move(<x1>, <y1>, <x2>, <y2>, <t1>, <t2>) : 移動字幕
                <x1>, <y1> 字幕出現座標.
                <x2>, <y2> 字幕停止座標.
                <t1>, 字幕出現停頓時間(單位 : 千分之一秒)
                <t2>, 字幕完成移動時間(單位 : 千分之一秒)
  範例 :
  Dialogue: Marked=0,0:00:02.00,0:02:20.00,Default1,,0000,0000,0000,,{\move(0,70,340,070,1000,12000)}redx
  Dialogue: Marked=0,0:00:03.00,0:02:20.00,Default1,,0000,0000,0000,,{\move(0,70,340,130,1000,9000)}製
  Dialogue: Marked=0,0:00:04.00,0:02:20.00,Default1,,0000,0000,0000,,{\move(0,70,340,190,1000,12000)}作

  \org(<x>, <y>) : 以<x>, <y>座標為原點, 配合旋轉使用
  範例 :
  Dialogue: 0,0:00:04.00,0:00:20.30,title,,0000,0000,0000,,{\fs16}{\pos(100,124)}{\org(162,200)}{\t(200,2000,1,\frz400)}redx製作

  \fad(<t1>, <t2>) : 淡入淡出
                <t1>, 字幕淡入時間(單位 : 千分之一秒)
                <t2>, 字幕淡出時間(單位 : 千分之一秒)
  範例 :
  Dialogue: Marked=0,0:00:04.00,0:00:10.00,Default,,0000,0000,0000,,{\pos(80,160)}{\fs28}{\fad(4000)}淡入
  Dialogue: Marked=0,0:00:10.00,0:00:16.00,Default,,0000,0000,0000,,{\pos(80,160)}{\fs28}{\fad(,4000)}淡出

  \t([<t1>, <t2>, ] [<accel>,] <style modifiers>) : 控制效果表現的時間, 很重要的一種特效代碼, 配合不同的style modifiers產生不同的變化
                <t1>, 字幕出現停頓時間(單位 : 千分之一秒)
                <t2>, 字幕完成效果時間(單位 : 千分之一秒)
                <accel>, 小於1(效果變化愈來愈慢),等於1(等速變化),大於1(效果變化愈來愈快).
                <style modifiers>, 可加入這些效果, \c,\1-4c,\alpha,\1-4a,\fs,\fr,\fscx,\fscy,\fsp,\bord,\shad,\clip (only the rectangular \clip)
                註 : \t之後1個數字表示<accel>, 2個數字表示<t1>, <t2>.
    配合\fr<degrees> : 旋轉字幕, degrees/360等於旋轉圈數.
    範例 :
    Dialogue: Marked=0,0:00:01.35,0:00:25.34,Default,,0000,0000,0000,,{\fs15}{\pos(130,60)}{\t(200,15000,1,\fry1440)}redx製作
    配合\fsc<percent>) : 變化字幕比例, percent : 原字幕大小的百分比.
    範例 :
    Dialogue: Marked=0,0:00:06.00,0:00:10.50,Default,,0000,0000,0000,,{\pos(160,140)}{\fscx100%}{\fscy100%}{\t(1,\fscx500%,\fscy500%)}放大
    Dialogue: Marked=0,0:00:11.00,0:00:14.50,Default,,0000,0000,0000,,{\pos(160,140)}{\fscx500%}{\fscy500%}{\t(1,\fscx100%,\fscy100%)}縮小

  \clip(<x1>, <y1>, <x2>, <y2>) : 排除, 從左上角座標到右下角座標圍住的方形範圍內有效,其餘一律排除.
                <x1>, <y1> 左上角座標.
                <x2>, <y2> 右下角座標.
  範例 :
  Dialogue: Marked=0,0:00:03.00,0:00:15.00,Default,,0000,0000,0000,,{\clip(0,0,200,245)}{\1c&Hff33ff&}{\2c&Hff33ff&}redx製作


d. 繪圖特效代碼 :

  \p<scale> : 啟動和關閉繪圖模式. scale表示座標的(scale-1)乘冪數,1表示2的0次方,4表示2的3次方,所以{\p1}的(1,2)座標等於{\p4}的(8,16)座標. 把scale放大的好處是可以設定更精密的座標. 例如{\p1}的(1,2)座標可用{\p4}的(8,16)座標表示,反之{\p4}的(7,10)座標就無法用{\p1}的(x,y)座標表示.
  繪圖指令:
  m <x> <y> : 移動到 <x>, <y> 座標
  n <x> <y> : 移動到 <x>, <y> 座標,但維持原來未完成封閉的圖形.
  l <x> <y> : 從目前的座標畫一條直線到<x>, <y>座標
  註 :
    1. {\px} (x > 0) : 啟動繪圖模式, {\p0} : 關閉繪圖模式
    2. 繪圖指令一定介於{\px}和{\p0}之間
  範例 :
  Dialogue: 0,0:00:03.00,0:00:15.00,title,,0000,0000,0000,,{\p1}m 10 10 l 30 10 30 32 10 32{\p0}

===============================================

B. 實現特效字幕的方法 :

  由於常見的外掛字幕有SRT和SUB/IDX兩大類型,如果影片已經有這種外掛字幕,再加上特效用的SSA就有兩個字幕,要如何讓影片加掛兩個字幕呢?這就要用到Avisynth或ffdshow(文章內沒有ffdshow的操作方法,有興趣的話可自行研究).
  SUB/IDX要轉成SSA比較麻煩,如果不轉的話就要用Avisynth才能實現SSA的效果,在此將分別介紹兩種作法.
  1. 首先介紹的是把SRT轉成SSA再加上SSA特效的部份,整個作法的流程如下 :

    使用軟體 : vobsub ( http://www.divx.com.hk/software/VobSub_2.23.exe )
  
    1-1. 調整vobsub設定,使SSA的效果發揮出來.
    [VobSub] -> [DirectVobSub Configure] -> [Misc] -> [Pre-buffer subpictures]取消打勾

    1-2. 用Vobsub的SubResync開啟SRT字幕檔,存檔時記得[Unicode output]要打勾,[存檔類型]選"Sub Station Alpha"就會把.srt字幕轉成.ssa字幕.用[記事本]編輯剛才轉的.ssa檔內容如下:
    [Script Info]
    ........
    [V4 Styles]
    Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour,   Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding
    Style: Default,Arial,18,&Hffffff,&H00ffff,&H000000,&H000000,-1,0,1,2,3,2,20,20,20,0,1
    [Events]
    Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
    Dialogue: Marked=0,0:00:00.00,0:00:01.66,Default,,0000,0000,0000,,第一行台詞
    Dialogue: Marked=0,0:00:01.66,0:00:03.33,Default,,0000,0000,0000,,第二行台詞
    Dialogue: Marked=0,0:00:03.33,0:00:04.04,Default,,0000,0000,0000,,第三行台詞
    .........

    1-3. 把自己製作SSA特效的部份插入字幕中(紅色部份).
    其中把用到的樣式加在[V4 Styles]的最後面.特效字幕可加在[Events]Format下的任何地方,但為了方便編輯和管理所以加在[Events]Format和第一個Dialogue中間.
    [Script Info]
    ........
    [V4 Styles]
    Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding
    Style: Default,Arial,18,&Hffffff,&H00ffff,&H000000,&H000000,-1,0,1,2,3,2,20,20,20,0,1
    Style: redx,標楷體,24,&Hdcdc23,&Hdd9ce2,&Hffffff,&Hffffff,0,0,1,2,1,2,20,20,20,0,136
    [Events]
    Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
    Dialogue: Marked=0,0:00:11.55,0:02:05.90,redx,,0000,0000,0000,Banner;50;00;100,{\pos(380,30)}{\3a&H7F&}{\4c&H45070c&}☆☆ 鄭重聲明:本示範來自redx論壇.  ^-^ ☆☆
    Dialogue: Marked=0,0:00:00.00,0:00:01.66,Default,,0000,0000,0000,,第一行台詞
    Dialogue: Marked=0,0:00:01.66,0:00:03.33,Default,,0000,0000,0000,,第二行台詞
    Dialogue: Marked=0,0:00:03.33,0:00:04.04,Default,,0000,0000,0000,,第三行台詞
    .........

    1-4. 存檔後使用一般合併字幕的方法開始轉檔.

  2. 接下來介紹的是用Avisynth實現SSA的效果,這種方法同時適用於SRT和SUB/IDX字幕.

    使用軟體 :
    vobsub ( http://www.divx.com.hk/software/VobSub_2.23.exe )
    AviSynth 2.5 ( http://prdownloads.sourceforge.n ... th_255.exe?download )
    VSFilter.dll ( http://prdownloads.sourceforge.n ... 050321.zip?download ) ,Windows 2000/XP系統把Release Unicode的VSFilter.dll複製到 C:\WINDOWS\system32
    avicodec ( http://avicodec.duby.info/ftp/AVIcod11.exe ), 開啟影片檔用來檢視fps數值.

    2-1. 調整vobsub設定,使SSA的效果發揮出來.
    [VobSub] -> [DirectVobSub Configure] -> [Misc] -> [Pre-buffer subpictures]取消打勾

    2-2. 用[記事本]建立.ssa檔內容如下 : (建議用1-2的方法產生.ssa字幕檔,再把[Events]下方的"Dialogue:..."全部刪除,剩下的內容如下)
    [Script Info]
    ........
    [V4 Styles]
    Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour,   Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding
    Style: Default,Arial,18,&Hffffff,&H00ffff,&H000000,&H000000,-1,0,1,2,3,2,20,20,20,0,1
    [Events]
    Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text

    2-3. 把自己製作SSA特效的部份插入字幕中(紅色部份)並存檔.
    [Script Info]
    ........
    [V4 Styles]
    Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding
    Style: Default,Arial,18,&Hffffff,&H00ffff,&H000000,&H000000,-1,0,1,2,3,2,20,20,20,0,1
    Style: redx,標楷體,24,&Hdcdc23,&Hdd9ce2,&Hffffff,&Hffffff,0,0,1,2,1,2,20,20,20,0,136
    [Events]
    Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
    Dialogue: Marked=0,0:00:11.55,0:02:05.90,redx,,0000,0000,0000,Banner;50;00;100,{\pos(380,30)}{\3a&H7F&}{\4c&H45070c&}鄭重聲明:本示範來自redx論壇.

    2-4. 假設現在有一個影片檔d:\abc.avi和一組外掛字幕檔d:\abc.sub+d:\abc.idx,加上剛才建立的d:\xyz.ssa字幕檔.接下來用[記事本]建立一個 "新增文字文件.txt"文字檔,內容如下:
    LoadPlugin("VSFilter.dll")
    DirectShowSource("d:\abc.avi",fps=xx)
    textsub("d:\xyz.ssa")
    vobsub("d:\abc.idx")
    註1 : DirectShowSource填入影片檔的完整路徑名, fps填入avicodec檢視的fps數值, 例如 fps=29.97
    註2 : 如果外掛字幕檔是d:\abc.sub+d:\abc.idx,字幕語言有英文,法文,中文,西班牙文...,而你要的字幕是排在第三位的中文,則需要用[記事本]編輯d:\abc.idx內的# Language index in use,把langidx: 0 改成 langidx: 2 (0代表第一種字幕語言,其餘類推).
    註3 : 如果外掛字幕檔是d:\abc.srt則第4行改成 textsub("d:\abc.srt"),也就是會有兩行textsub.

    2-5. 新增文字文件.txt存檔後更名為 xxxx.avs, .avs即AviSynth的script檔.
  
    2-6. xxxx.avs可視為一個影片檔(正確的說法是一個frame server),可用軟體播放或轉檔.
    註1 : 如果用media player classic播放必須調整設定才能看到SSA特效 :
       [view] -> [options] -> [Playback] -> [Output] -> [DirectShow Video]選 "VMR7(或VMR9)renderless -> [Subtitles] -> [Number of subpictures to buffer ahead]設"0" -> [OK].
    註2 : 有些軟體不支援.avs的話,可用VirtualDub開啟.avs -> [Video]和[Audio]都選[Direct stream copy] -> 按[File]的[Start frame server] -> [Start] -> "xxxxx.vdr" -> [儲存],再用該軟體開啟xxxxx.vdr(.vdr也是一個frame server).

終於把如何製作一個動態特效字幕的心得完成了,其中SAA字幕的介紹主要是參考自 http://moodub.free.fr/ass-specs.doc ,有部分的內容因個人覺得很簡單或尚未完全參透所以並沒有寫下來,有興趣深入研究的朋友可自行下載研究.
文章內的每個範例都經過個人實際測試,如果你在執行過程中發現任何問題,個人十分歡迎各位的指教.