FFMPEG 中級指南/字幕選項
字幕可以來自單獨的文字檔案(通常副檔名為 .srt)或來自影片檔案中的專用流。在後一種情況下,字幕通常儲存為點陣圖而不是文字,這些點陣圖疊加在影片上,對於 DVD 可能被稱為“VOBSUB”,對於藍光則可能被稱為“PGS”。
請注意,字幕流不必在整個影片中都存在,並且可能僅在第一次出現字幕對話時才出現。因此,字幕流可能不會被
ffmpeg -i <input>
檢測到並列出,它僅搜尋輸入檔案中的短距離。
要強制 ffmpeg 進一步搜尋字幕流,請使用選項
-probesize <bytes> -analyzeduration <microseconds>
這將使 ffmpeg 繼續搜尋,直到達到這些限制中的第一個限制。請注意,這兩個選項都必須在命令列上出現,然後才能透過 -i 指定輸入。例如
ffmpeg -probesize 50M -analyzeduration 100M -i vts.vob
將搜尋 vts.vob 中的所有流,直到它讀取了 50 MB 的資料或 100 秒的影片,以先到者為準。
字幕可以作為 並行流 包含在編碼的影片檔案中,也可以被 永久渲染(也稱為“燒錄”)到影片本身中。
ffmpeg -i "INPUT" [-sub_charenc [character encoding]] -i "SUBTITLE_INPUT"
-vcodec [codec] -acodec [codec] -scodec [codec] [...] "OUTPUT"
設定輸入文字字幕字元編碼轉換
-sub_charenc [character encoding]
如果您要匯入並編碼包含某些語言(如法語、德語、義大利語、西班牙語等)特殊字元的字幕純文字檔案(Windows/ANSI),則需要此選項將字幕編碼從 Windows/ANSI 轉換為 UTF-8。
[字元編碼] 引數示例
CP1252、CP874、CP936、CP1250、...、CP1258、
LATIN1、LATIN2、...、LATIN8、LATIN-9、LATIN10、
ISO-8859-1、ISO-8859-2、...、ISO-8859-16、
UTF-8、UTF-16、UTF-32
UNICODEBIG、UNICODELITTLE
另請參見:sub_charenc_parameters.txt 在 #2431 中
筆記
[-sub_charenc [字元編碼]] 不是必需的,但無論何時使用,它都必須放在要使用該編碼處理的字幕的引用之前。
當您設定字幕編碼時,不要忘記也設定字幕編解碼器(見下文)。如果您使用 -c:s copy,字幕內碼表將不會被轉換!
如果您嘗試在沒有使用“-sub_charenc”的情況下使用較新版本的 FFmpeg 匯入 ANSI 字幕檔案,您可能會收到類似的錯誤訊息
解碼字幕文字中的 UTF-8 無效;可能缺少 -sub_charenc 選項
然後,您必須使用“-sub_charenc”選項來定義字幕檔案的正確編碼格式或內碼表。
強制設定字幕編解碼器('copy' 用於複製流)
-scodec [subtitle codec]
並非每個字幕編解碼器 都可以用在每個影片容器格式中!
[字幕編解碼器] 引數示例
對於MKV 容器:copy、ass、srt、ssa
對於MP4 容器:copy、mov_text
對於MOV 容器:copy、mov_text
筆記
許多飛利浦藍光播放器、三星智慧電視和其他獨立播放器只能讀取“MKV”檔案中“SRT”字幕流。
使用 ISO 639 語言程式碼(3 個字母)設定字幕語言
-metadata:s:s:[stream number] language=[language code]
-metadata:s:s:0 ... 這表示要設定... Stream:Subtitle:流號,從 0 開始 的元資料
[語言程式碼] 引數示例
eng - 英語
fre 或 fra - 法語
ger 或 deu - 德語
ita - 義大利語
spa 或 esp - 西班牙語
ffmpeg -i input.mp4 -sub_charenc CP1252 -i subtitle.srt -map 0:v -map 0:a -c copy -map 1 -c:s:0 mov_text -metadata:s:s:0 language=ger output.mp4
ffmpeg -i input.mkv -sub_charenc CP1252 -i subtitle.srt -map 0:v -map 0:a -c copy -map 1 -c:s:0 srt -metadata:s:s:0 language=fre output.mkv
或
ffmpeg -i input.mp4 -sub_charenc CP1252 -i subtitle.srt -vcodec copy -acodec copy -scodec mov_text -metadata:s:s:0 language=ger output.mp4
ffmpeg -i input.mkv -sub_charenc CP1252 -i subtitle.srt -vcodec copy -acodec copy -scodec srt -metadata:s:s:0 language=fre output.mkv
2 個獨立的 .srt 字幕檔案的示例
ffmpeg -i input.mp4 -i subtitle_eng.srt -i subtitle_fre.srt \
-map 0:v -map 0:a -map 1 -map 2 \
-c:v copy -c:a copy -c:s copy \
-metadata:s:s:0 language=eng -metadata:s:s:1 language=fre \
output.mkv
ffmpeg -i input.mov -sub_charenc WINDOWS-1252 -i subtitle.srt -vcodec h264 -acodec mp3 -scodec mov_text -metadata:s:s:0 language=spa output2.mp4
ffmpeg -i input.avi -sub_charenc ISO-8859-1 -i subtitle.srt -vcodec h264 -acodec ac3 -scodec srt -metadata:s:s:0 language=ita output2.mkv
透過在命令列上指定一個複雜的過濾器,字幕可以永久地渲染到影片流中
-filter_complex "[0:v][0:s]overlay"
這可以解釋為“從第一個列出的輸入中獲取所有影片流,然後從第一個列出的輸入中獲取所有字幕流,並將後者疊加到前者,以生成一個取代所有消耗流的單個影片流”。新流將由編碼器對映,就像任何正常的影片輸入流一樣。
對於 VOBSUB(即 DVD 上的點陣圖字幕),字幕的顏色由 DVD 上的 .IFO 檔案中指定的調色盤決定,但 ffmpeg 無法訪問它,因此字幕的顏色將很大程度上是任意的,除非在命令列上使用以下命令指定調色盤
-palette "<list of 16 comma-separated RRGGBB hex codes>"
不幸的是,用於渲染字幕的調色盤條目在不同的影片之間會有所不同,因此需要一些實驗。通常,一個條目將決定字型顏色,另一個條目將決定輪廓顏色,儘管有些影片的字幕使用多個輪廓,每個輪廓都有自己的調色盤條目。
搜尋字幕流的相對較深的深度,然後將其以綠色和黑色渲染到 h264 輸出影片中的完整命令列可能如下所示
ffmpeg -probesize 100M -analyzeduration 120M -palette "ffffff,000000,ffffff,00ff00,ffffff,ffffff,ffffff,ffffff,ffffff,ffffff,ffffff,ffffff,ffffff,ffffff,ffffff,ffffff" -i input.vob -filter_complex "[0:v][1:s]overlay" -acodec copy -vcodec libx264 output.mp4