[時間:2019-03] [狀態:Open]
[關鍵詞:字幕,SRT,文件格式]
0 引言
視頻文件中最簡單、最常見的外掛字幕格式是SRT(SubRip Text)。本人找了好久也沒找到類似的標准文檔,從wiki等資料來看,SRT格式是SubRip軟件所生成從DVD或視頻文件提取的字幕格式,SubRip軟件使用OCR將基於圖形的字幕轉化為純文本格式的字幕,這樣就可以支持諸如渲染、檢索、數據分析等諸多用途。后來出於某些原因普及起來,被主流多媒體播放器所支持,由此也催生了各種字幕組產生。
本文的內容將包括:
- SRT字幕基本格式
- SRT特效設置
- ffmpeg中srt相關用例
1 SRT基本格式
SRT字幕通常以srt作為后綴,作為外掛字幕,多數主流播放器都支持直接加載並顯示SRT字幕,具體細節看參考SubRip (.SRT) subtitles support in players。
該格式是基於純文本的格式,使用CR+LF作為換行符(Windows下常用換行符,*nix使用LF作為換行符)。每個SRT文件包含至少一個字幕段。
每個字幕段有四部分構成:
- 字幕序號
- 字幕顯示的起始時間
- 字幕內容(可多行)
- 空白行(表示本字幕段的結束)
其中字幕序號一般是順序增加的,表示字幕是一系列連續的序列。但該數值在字幕顯示中不起任何作用,只是起着標記和標識的作用,方便分配翻譯行數用。字幕序號的值可以隨意,1和100都一樣,並不會影響字幕的顯示。但字幕序號也是字幕段的一部分,所以不能沒有或者刪去,否則在播放時,將出現錯誤。
字幕顯示起始時間的格式如下:
hour:minute:second.millisecond --> hour:minute:second.millisecond 或
hour:minute:second,millisecond --> hour:minute:second,millisecond
后面還可以附加用於指定字幕顯示位置的信息,以像素為單位,格式如下: X1:number Y1:number X2:number Y2:number。
一個典型的SRT文件如下(截取自阿凡達中英字幕):
3
00:00:39,770 --> 00:00:41,880
在經歷了一場人生巨變之后
When I was lying there in the VA hospital ...
4
00:00:42,550 --> 00:00:44,690
我被送進了退伍軍人管理局醫院
... with a big hole blown through the middle of my life,
5
00:00:45,590 --> 00:00:48,120
那段時間我經常會夢到自己在飛翔
... I started having these dreams of flying.
6
00:00:49,740 --> 00:00:51,520
終獲自由
I was free.
7
00:00:54,620 --> 00:00:55,830
而不幸的是
Sooner or later though, ...
2 SRT格式化設置
多數SRT支持一些特定格式化,比如斜體、粗體、下划線以及字體顏色。使用時需要基於HTML的標簽,具體用法如下:
<font color=red>顏色</font>
<i>字體斜體</i>
<u>字體下加划線</u>
<br>換行
<b>字體加粗</b>
這些HTML可嵌套。
當然某些播放器還對SRT做了擴展,可以支持ASS/SSA中部分格式化代碼。
3 ffmpeg中srt相關用例
使用ffmpeg可以很輕松的把ass/vtt/lyric轉換為srt文件,命令如下:
ffmpeg -i a.ass b.srt
ffmpeg -i c.vtt d.srt
ffmpeg -i e.lyric f.srt
使用ffplay現在字幕需要使用subtitles filter,具體命令如下:
./ffplay test.mp4 -vf subtitles=test.srt
對於FFmpeg中的srt demuxer的實現邏輯,基本上是參考SRT基本格式實現的,其中並未支持各種格式,具體代碼請查看srtdec.c。
4 小結
srt字幕以其簡單、體積小、易查看、易掌握等優點,深得人們的喜愛,但便利的代價就是樣式少,無法實現復雜的特效。
本文整理了srt字幕的基本格式以及支持的格式,同時介紹了ffmpeg中srt格式生成和渲染的用法,僅供后續參考。
