使用ass字幕文件通過ffmpeg給視頻添加字幕的一些研究
Author:lihaiping1603@aliyun.com
Create:2019-09-04
最近對ffmpeg給視頻文件添加字幕效果,進行了一些調試和研究,個人做個筆記,方便以后查找和使用。
將字幕加入到視頻文件中,有兩種方式:
1)第一種是將字幕以除了音視頻之外的字幕流的形式添加到視頻文件格式中,然后播放器在播放這個視頻文件的時候,就可以顯示相應的字幕效果了,該方式對於已經存在的視頻文件,可以不用對音視頻進行轉碼,速度和效率較高,但缺陷是對於一些格式不支持一些字幕編碼格式,例如mp4不支持ass編碼格式字幕流,而mkv支持。所以對於mkv格式的視頻文件,我們可以利用如下的命令方式直接添加字幕流:
Ffmpeg -i video.mp4 -i subtitle.ass -c:v copy -c:a copy -c:s ass -y dest.mkv
2) 另外一種方式是將字幕流燒錄到視頻流中,即當成視頻效果的一部分,通過字幕濾鏡處理。優點是支持所有的視頻文件格式,缺點是需要對原視頻中的視頻流進行轉碼處理,耗時耗硬件資源。例如將字幕文件燒錄進mp4,可以利用如下的命令方式直接添加字幕:ffmpeg -i video.mp4 -vf ass=subtitle.ass -y dest.mp4
3) 同時這里介紹一下aas格式中的一些不是特別好理解的東西(相關基礎資料可以參考:
aas文件格式介紹:
https://blog.csdn.net/winglyx/article/details/6791719;
https://www.douban.com/note/658520175/;
ass特效標簽介紹:
https://aegi.vmoe.info/docs/3.2/ASS_Tags/;)。
針對字幕顯示的位置,如何在ass中指定呢?這里我找到兩個相關的字段\an和 \pos這兩個字段:

這個是\an的介紹,我們假設我們是在一個虛擬的字幕輸入框中輸入我們的字幕,那么這個an的方式設置其實就是針對字幕輸入框中當我們輸入字幕的時候,這些字幕是如何在輸入框中從什么位置開始展開的,也即以為字幕輸入框的參考點設置,例如當我們設置為an5的時候,那么輸入字幕的時候,參考點為輸入框的中心,所以字幕增加的時候,就會在輸入框向兩邊拓展展示。下面我們在確定pos和an的時候,字幕輸入不同的字數的時候的截圖如下:


所以an5,即輸入框的參考點為輸入框的中心位置。
接下來,我們再聊一下pos的問題:



pos指定的位置是基於原始視頻畫布的物理坐標,畫布左上角為pos(0,0),右下角為pos(width/2,height/2);所以我們這里來看一下pos(0,0)的時候,改變an的參考點對齊方式,他的效果是怎么樣的,看了,也許你就明白了。
An4_pos0_0:

An5_pos0_0:

An7_pos0_0:

這里更正一下:
上面的測試是在視頻文件分辨率為968x544的分辨率的基礎上,使用ass文件內容如下的測試結果。
ass文件內容:(注意script info中沒有指定視頻分辨率)
[Script Info] ; Script generated by Aegisub 3.2.2 ; http://www.aegisub.org/ Title: YYeTs ; Original Script: YYeTs Synch Point: 0 ScriptType: v4.00+ Timer: 100.0000 ScaledBorderAndShadow: no YCbCr Matrix: TV.601 WrapStyle: 0 [V4+ Styles] Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding Style: Default,SourceHanSerifCN-Regular,20,&H00F83C4A,&H00000000,&H00442121,&H00000000,0,0,0,0,100,100,0,0,1,1,1,2,5,5,2,134 [Events] Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text Dialogue: 0,0:00:00.00,0:00:11.04,*Default,NTP,0,0,0,,{\an5\pos(0,0)}Hi,我是沐雨橙風
當修改ass中的script info的時候,會出現pos不同的情況,例如在script info中加入
PlayResX: 968
PlayResY: 544
指明視頻的實際分辨率的時候,最右下角的坐標將變為pos(968,544),就不再是pos(484,272)了,至於在不指定的情況下,為啥會為1/2,暫時還沒找到相關資料查證。
上述過程如果有誤,請留言一起交流和更正整個過程。謝謝!
轉載請注明出處:https://www.cnblogs.com/lihaiping/p/11460790.html
