影音視頻外掛SSA字幕代碼詳解及製作教程 進階篇

公元2017年05月25日沒人鳥我喲打醬油看熱鬧的有:368 views

影音視頻外掛SSA特效字幕的代碼詳解和進階製作教程 進階篇

影音視頻外掛SSA特效字幕的代碼詳解和進階製作教程 進階篇.沫

二章 SSA格式基礎

在全面學習SSA代碼編寫特效之前,先介紹幾個概念。SSA文件的結構正是由這些概念所組成的,在以後的SSA代碼學習過程中,你會發現這些概念緊緊伴隨你左右。本章簡單的介紹了SSA文件的幾個重要部分,對其中的信息部分和事件部分又做了進一步的討論。結束本章的學習後,你將驚喜的發現,SSA文檔已經去掉了神秘感,展現在你眼前的再也不是不知所雲的天書了,並且你可以嘗試著在上一章例子的基礎上做一些改動,使得你的字幕看起來更加可愛。

第一節 幾個概念

SSA文檔結構性很強,從上面的例子中可以看到,第一行有[Script Info]這樣的文字。還有下面有[V4 Styles]和[Events]兩行,凡是這種行開頭用一對中括號括起來的文字都標識著SSA文檔的一個部分。第一個概念,部分。SSA文檔可以分成若幹的部分,但是主要的部分只有兩個。下面一一介紹。

[Script Info] 信息部分。這部分保存關於SSA代碼腳本總信息。必須要放在SSA文檔的首位。也是必不可少的一個部分。
[V4 Style] 格式部分。這部分定義制作字幕中所用到的格式類型。
[Events] 事件部分。這部分保存具體的字幕顯示方式。
[Fonts] 字體部分。對於內嵌字體信息的定義。
[Graphics] 圖像部分。對於內嵌圖像信息的定義。

其中[Fonts]部分和[Graphics]部分一般不用,所以我就不費筆墨做過多的介紹,以後用到會做介紹的。一般的SSA文件由前三個部分所組成,尤其是格式定義和事件部分的完美結合,體現了SSA外掛字幕的格式自定義的特點。這樣,又引申出另一個概念,格式。

引用內容:
[V4 Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding
Style: Default,simhei,15,&Hffffff,&Hfcc4a5,&H000008,&H000008,0,0,1,1,1,2,30,30,10,0,1

這段代碼取自上一章我們使用SubCreator生成的SSA字幕文件,其中第三行由Style字樣開始的就是定義格式,在同一個字幕文件中可以定義很多種類不同的格式,用於顯示不同用途的字幕,比如可以定義專門顯示字幕的主風格,然後再定義一個用來顯示歌詞文本的字幕格式,定義用來顯示制作成員列表的字幕格式,定義用來顯示免責聲明的文本格式。但是無論怎樣發揮你的聰明才智去定義五花八門的字幕格式,Default格式是必不可少的。在Style定義的格式中,規定了將來在事件部分中使用此格式的字體名稱,字號等等各種各樣的屬性,Style定義字體的具體介紹會在第二節講解。

定義了各種格式之後,就要實際應用到字幕顯示中,這在事件部分[Events]中實現。好,介紹第三個概念,也是最重要的概念,事件。

引用內容:
[Events]
Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: Marked=0,0:02:27.50,0:02:31.00,Default,,0000,0000,0000,,這條街上的太陽已經死去
Dialogue: Marked=0,0:02:31.00,0:02:33.60,Default,,0000,0000,0000,,天空又狹窄 也沒有深山
Dialogue: Marked=0,0:02:34.40,0:02:37.20,Default,,0000,0000,0000,,映入眼簾的只有灰色的建築物
Dialogue: Marked=0,0:02:37.20,0:02:38.60,Default,,0000,0000,0000,,跟人來人往的人潮

我截取了上一章生成的SSA文件一小部分事件代碼。從[Events]標註開始的都是事件部分。發生在同一時間或者時間段內,具有相同或者極其相近屬性的事情,稱為事件。SSA規定了對話(Dialogue)事件、註釋(Comment)事件、圖片(Picture)事件、聲音(Sound)事件、影片(Movie)事件和命令(Command)事件這樣幾類。這裏我們只是使用了對話事件。從第三行開始,每一行的起始都是Dialogue標記,這就是對話事件。切記,每一個事件占用一行的文本,所以不能把同一個事件分成多行書寫。在一般的字幕制作中,顯示在一個畫面的字幕正好對應一個對話事件,所以如果同時顯示兩行字幕的話,雖然想要使用雙行顯示,但是由於這兩行文本是同時出現在同一個畫面裏面(即上面所提到的發生在同一個時間段內),而且都是主字幕(即具有相同的屬性),應該屬於同一個事件,而同一事件不能寫成兩行,所以輸入的字幕文本不能加入回車換行。解決這類問題要用到跨格式標記(Style Override),後面會有大篇幅詳細介紹。註釋事件就是一個以分號為行首的文本,例如,我們在上面的例子中在默認的Default格式定義的下面加上一個說明其功能的註釋:

引用內容:
[V4 Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding
;下面的格式定義了主字幕顯示時候使用的字體風格
Style: Default,simhei,15,&Hffffff,&Hfcc4a5,&H000008,&H000008,0,0,1,1,1,2,30,30,10,0,1

其中第三行行首的分號表示本行後面的內容都是註釋,註釋在腳本執行的時候自動忽略。對於有編程經驗的人來說,理解什麽是註釋並不困難。我們只不過是把C++語言中的符號“//”變成分號而已,不過不要忘記這一點。其他類型的事件在今後用到的時候再提起。

剛才我們討論對話(Dialogue)事件的時候提到了跨格式標記(Style Override),先看下面的代碼:

引用內容:
Dialogue: Marked=0,0:01:21.70,0:01:30.00,Title,,0000,0000,0000,,{\pos(120,220)\fs28\fade(255,0,0,0,1000,1600,1700)}{\t(1000,1500,,\1c&Hcdbe91&)}{\t(1500,2000,,\bord0)}{\t(1500,2000,,\1c&H000000&)}{\3c&Heef0b9&\t(2800,4200,,\bord3)}魔法使
Dialogue: Marked=0,0:01:21.70,0:01:30.00,Title,,0000,0000,0000,,{\pos(175,220)\fs20\fade(255,0,0,0,1000,1600,1700)}{\t(1000,1500,,\1c&Hcdbe91&)}{\t(1500,2000,,\bord0)}{\t(1500,2000,,\1c&H000000&)}{\3c&Heef0b9&\t(2800,4200,,\bord3)}的
Dialogue: Marked=0,0:01:21.70,0:01:30.00,Title,,0000,0000,0000,,{\pos(140,251)\fs30\fade(255,0,0,0,1000,1600,1700)}{\t(1000,1500,,\1c&Hcdbe91&)}{\t(1500,2000,,\bord0)}{\t(1500,2000,,\1c&H000000&)}{\3c&Heef0b9&\t(2800,4200,,\bord3)}註意事項

我們剛剛介紹了事件(Events)的概念,這三行代碼正好就是對話(Dialogue)事件。可以看出來這裏的對話事件和前面的有所不同,註意每行最後一個逗號後面的文本:

引用內容:
{\pos(120,220)\fs28\fade(255,0,0,0,1000,1600,1700)}{\t(1000,1500,,\1c&Hcdbe91&)}{\t(1500,2000,,\bord0)}{\t(1500,2000,,\1c&H000000&)}{\3c&Heef0b9&\t(2800,4200,,\bord3)}魔法使
{\pos(175,220)\fs20\fade(255,0,0,0,1000,1600,1700)}{\t(1000,1500,,\1c&Hcdbe91&)}{\t(1500,2000,,\bord0)}{\t(1500,2000,,\1c&H000000&)}{\3c&Heef0b9&\t(2800,4200,,\bord3)}的
{\pos(140,251)\fs30\fade(255,0,0,0,1000,1600,1700)}{\t(1000,1500,,\1c&Hcdbe91&)}{\t(1500,2000,,\bord0)}{\t(1500,2000,,\1c&H000000&)}{\3c&Heef0b9&\t(2800,4200,,\bord3)}註意事項

和剛才我們自己編寫的純文本並不一樣,增加了很多奇奇怪怪的東西,這些就是跨格式標記(Style Override)代碼,這裏的代碼使用了漫遊提供的《魔法使的註意事項》中動畫名稱顯示特效的代碼,我們把它添加在自己創建的SSA文件中的[Events]部分裏面。至於代碼是怎樣起作用的,以及如何使用代碼,不要急,心急吃不了熱豆腐。

總結一下,我們介紹了幾個概念,也許現在你對於這些概念還是一頭霧水,沒有關系,頭腦裏有個大概的印象就可以了,我們一步一步來。簡單重復一遍,SSA文件分為[Style Info]信息部分、[V4 Stlye]格式部分、[Events]事件部分等;格式部分中以Style為行首標記一行文本定義了一種風格的字幕格式,我們可以定義很多種格式,但是必須有Default格式;[Events]中以Dialogue為行首的一行文本是一個對話事件,用來顯示字幕,以分號為行首的是註釋,腳本執行的時候會忽略;高級字幕格式設置需要使用被稱作跨格式標記(Style Override)的代碼。記住它!

第二節 格式

我們在本章第一節介紹了格式的有關概念,我們認識到格式是對字幕風格的定義。具體的定義方法我們還不了解,只能使用SubCreator生成代碼,下面我們將自己創建新的格式。首先我們學習格式的定義方法,介紹定義格式的各個字段及其功能,然後我們利用第一章的例子手動添加新的字幕格式。

字幕格式的定義很簡單,在[V4 Style]下一行寫入Format字樣,表示這是格式的內容先看例子:

引用內容:
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding

Format:表示定義格式的內容。這裏的冒號不能省略。這一行必須緊跟在[V4 Style]之後,要在所有以Style:開始的格式定義之前,這樣腳本中定義的格式才能被正確識別。冒號之後跟著若幹字段,每個字段之間用逗號分隔。這些字段的名字是規定好的,不能隨意改變,所以在書寫的時候一定要保證正確拼寫所有的字段。字段的順序就是下面定義格式所使用的順序。在定義格式之前,必須了解每個字段的含義。
Name 定義格式的名稱。比如叫做“SubFont”,表示主字幕所使用的格式。註意的事情:叫做“SubFont”和“subfont”名字的表示不同的格式,也就是說這個字段是區分大小寫。前面介紹過,無論SSA文件可以定義多少個格式,但是必須有Default格式,這個“Default”就是格式的名稱。所以第一個格式的名字總是Default。
Fontname 使用的字體。比如“Verdana”,表示字幕使用這種字體,一般使用中文字體的時候可能你會輸入“黑體”或者“楷體_GB2312”這樣的文字,但是我建議使用字體本身的英文標識比較好,比如“SimHei”。這個字段同樣區分大小寫。
Fontsize 字體大小。通常是一個數字。比如“12”,表示12號字體,如果前面所說的Fontname字段使用的是宋體,那就表示宋體12號。
PrimaryColour 原始顏色。我們在第一章創建字幕文件的時候講過用十進制和十六進制表示顏色的方法,同樣,這裏也可以這樣表示顏色。使用長整型的十進制數字或者使用八個字節(我們以前提到的六個字節表示十六進制顏色值,再加上&H這兩個字節表示這是一個十六進制數字)的十六進制數字表示顏色。我再一次推薦使用十六進制表示顏色,在以後的學習中你會發現它的好處。這個顏色表示字幕使用的主要顏色。
SecondaryColour 第二顏色。當字幕變換顏色與原始顏色沖突時顯示這個顏色。最常用的例子是卡拉OK的字體變色效果,有時候制作標題效果時候也會用到。
TertiaryColour 第三顏色。當字幕變換顏色與原始顏色和第二顏色沖突時顯示這個顏色。第三顏色即為輪廓線顏色,當使用輪廓線的時候,其顏色取決於此值。
BackColour 背景顏色。當使用輪廓和陰影時,這個顏色就表示輪廓和陰影的顏色。一般來說,輪廓能夠正常表示出這個顏色,而陰影顏色稍微暗一些。
Bold 加粗。決定是否加粗字體。1表示加粗,0表示不加粗。
Italic 傾斜。決定是否傾斜字體。1表示傾斜,0表示不傾斜。
BorderStyle 邊框樣式。1表示使用字體輪廓和陰影,3表示用一個矩形做字幕的背景。如果使用矩形做為字幕的背景,背景顏色就是BackColour字段定義的顏色。
Outline 輪廓量。範圍在0到4之間,單位是像素。
Shadow 陰影量。數值設置和輪廓一樣。註意一個細節,如果你不想使用邊框樣式,可以將其設置成1,即用字體輪廓和陰影,然後將Outline和Shadow都設置為0即可。
Alignment 字幕位置。共有九個數字可供設置,每個數字代表一個位置:1、底部左對齊;2、底部居中;3、底部右對齊;5、頂部左對齊;6、頂部居中;7、頂部右對齊;9、中部左對齊;10、中部居中;11、中部右對齊。有個簡單的記憶方法:1表示左對齊,2表示居中,3表示右對齊,在此基礎上加4表示字幕在頂部,加8表示在中部。例如頂部居中是6,即(居中)2+(頂部)4=(頂部居中)6。
MarginL 左邊距。設定字幕距離屏幕最左端的空白寬度,單位是像素。
MarginR 右邊距。設定字幕距離屏幕最右端的空白寬度,單位是像素。
MarginV 垂直邊距。依據字幕所在位置不同而含義有所不一。當字幕在底部時,表示字幕距離屏幕最底端的空白高度;當字幕在頂部時,表示字幕距離屏幕最頂端的空白高度;當字幕在中部時,這個字段所定義的數值忽略不計,字母將被垂直居中顯示。單位是像素。
AlphaLevel 透明值。這個字段本來用於設置字幕的透明度,但是SSA中並沒有真正使用,所以一般我們都是設置為0。
Encoding 編碼。用於文本的編碼,英語使用0,簡體中文使用134。如果不能確定使用的編碼,建議都設置為0。

定義格式的時候要以Style:開頭,後面按照每個字段的順序設置相應的值。下面我們添加一個新的格式,用來顯示動畫的主標題。格式的名稱叫做Title,使用宋體(simsun)24號字,加粗不傾斜,原始顏色和第二顏色都使用白色,第三顏色使用純紅色,背景顏色代碼&Hcdbe91,使用字體輪廓和陰影,寬度分別是3和1,字幕要求底部居中,左右邊距都是30像素,距屏幕底部5像素,使用簡體中文編碼。按照書寫格式,應該是這樣的:

引用內容:
; 標題
Style: Title,simsun,24,&Hffffff,&Hffffff,&H0000ff,&Hcdbe91,0,0,1,3,1,2,30,30,5,0,1

把它加入到[V4 Style]部分中Default格式的下面,這樣一個新的格式就定義成功了。我們練習一下這部分的內容,分別定義幾個新的格式,並添加到你的SSA文件中,我們將在以後的學習過程中用到這些定義的格式:

引用內容:
; 日文歌詞
Style:SongJap,MS PGothic,12,&HFFFFFF,&Hffffff,&H000000,&H008080,0,0,1,2,3,6,30,30,0,0,0
; 歌詞羅馬註音
Style:SongRom,Comic Sans MS,14,&Hff5000,&Hffffff,&H00ff00,&Haaccff,0,0,1,2,2,6,30,30,0,0,0
; 中文歌詞
Style:SongChn,simhei,14,&H00ffff,&Hffffff,&H0000ff,&Hff8000,0,0,1,2,3,2,30,30,5,0,134

註意,我們在日文歌詞這個格式中使用了MS PGothic字體,這是日文字體,一般並不存在於中文操作系統的計算機上,需要額外的下載。XP的多國語言和Office的日語支持都會自動安裝這種字體。

第三節 事件

事件包含了字幕的文本,顯示時間,使用的字幕格式等內容,這裏僅介紹對話(Dialogue)事件。前面介紹過,[Events]標簽下一行緊跟著事件格式的定義,我們具體介紹定義的方法和內容。然後生成幾個新的事件,練習所學過的內容。先看看事件格式的定義:

引用內容:
Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text

和字幕格式的定義一樣,事件格式的定義也是以Format:開始的,這裏的冒號不可省略。後面是若幹字段,字段之間用逗號分隔。字段的拼寫必須正確,否則將無法正確執行SSA文件腳本。使用事件的時候必須按照這個定義的順序寫入事件各個字段的具體值,開頭以具體的事件類型加冒號開頭,例如加入新的字幕事件,就以Dialogue:開頭。具體介紹各個字段的含義:

Marked 標記。Maked=0表示不被標註;Maked=1表示被標註。通常使用Maked=0。
Start 字幕起始時間。格式是h:mm:ss:xx。h是小時,m是分,s是秒,x是百分秒。例如:0:02:23:45表示這個事件從2分23秒450毫秒的地方開始。有時候習慣把百分秒和秒寫到一起,中間用小數點隔開,所以0:02:23.45也是正確的。註意,小時只能是一位數字。
End 字幕終結事件。格式同起始時間。小時只能是一位數字。
Style 字幕格式。當前字幕所使用的格式。我們在上一節中講到的格式就是在這裏使用,輸入格式的名稱(Name)字段即表示使用該格式。例如,我們使用前面定義的標題格式,那麽這裏輸入Title。
Name 字幕名稱。專門標註事件的標識符,一般情況下這項省略不添,但是跟在它後面的逗號不可省略。
MarginL 左邊距。格式:dddd,d表示一位數字。如果全部為0,則使用Style中定義的左邊距。否則優先使用當前定義的左邊距。
MarginR 右邊距。使用方法同左邊距。
MarginV 垂直邊距。使用方法同左邊距。
Effect 變換效果。留空表示不使用任何效果,但是後面的逗號不能省略。或者使用SSA規定的幾個效果濾鏡,詳細的效果使用方法會在稍後講解。
Text 字幕文本。真正用於在屏幕上顯示字幕的文本,由於前面已經有九個逗號存在,所以此後的字符串都被認為是文本,當然也包括逗號。字幕換行可以使用\n,也可以在字幕文本中使用跨格式標記(Style Override)代碼。

我們先練習一下剛剛講述的內容,在片子(今後如果不作特別說明,片子指《魔法使的註意事項》第一話片源,字幕文件指第一章創建並在以後不斷完善的字幕)的1分40到2分20之間添加一行字幕。我們的字幕還要用新的叫做Shiner的格式。在字幕文件中加入下面內容,先看代碼:

引用內容:
……
[V4 Style]
……
; 自定義格式
Style: Shiner,simhei,15,&Hffffff,&Hff00ff,&H0000ff,&Hcdbe91,0,0,1,2,2,6,10,10,5,0,134
[Events]
……
Dialogue: Makerd=0,0:01:40.00,0:02:20.00,Shiner,,0000,0000,0000,,字幕顯示測試
……

根據所學的內容,我們應該能夠看懂上面代碼的意思。首先我們創建了名為Shiner的字幕格式,使用黑體15號字,原始顏色白色,第二顏色純紫色,第三顏色純紅色,背景顏色石青色,文字加粗不傾斜,使用字體輪廓和陰影效果,輪廓和陰影寬都為2像素,字幕頂部居中顯示,左右邊距均為10像素,距屏幕頂部5像素,簡體中文編碼。然後我們在事件部分中添加了一個新的對話事件,從1分40顯示到2分20結束,使用剛才定義的Shiner格式,使用默認的左右邊距和垂直邊距,顯示的字幕是“字幕顯示測試”。保存SSA文件,運行播放器看到,在我們規定的時間內,字幕正確地顯示在屏幕上,各種效果和設置的完全一樣。如圖:

影音視頻外掛SSA特效字幕的代碼詳解和進階製作教程 進階篇.沫