「把字幕壓進影片」其實有兩種完全不同的做法,結果差很多: 一種是把字畫進畫面像素裡(硬字幕),一種是把字幕當成另一條軌道封裝進檔案 (軟字幕)。選錯會白花一次轉檔時間。
| 硬字幕(burn-in) | 軟字幕(封裝軌道) | |
|---|---|---|
| 字在哪 | 畫進畫面的像素裡 | 獨立軌道,播放時才疊上去 |
| 可以關掉嗎 | 不行,是畫面的一部分 | 可以,也可以切換多語言 |
| 需要重新編碼嗎 | 要,畫面被改了 | 不用,只是換個容器 |
| 處理時間 | 長(等同重壓整支影片) | 短(通常幾秒鐘) |
| 畫質 | 會有一次重新編碼的損失 | 完全無損 |
| 相容性 | 最好,任何地方都看得到 | 看播放器與容器支援 |
MKV 容器對字幕支援最完整,SRT 與 ASS 都能直接放進去:
ffmpeg -i input.mp4 -i subtitle.srt -c copy -c:s srt output.mkv
-c copy 表示影音串流原封不動搬過去,所以這個指令通常幾秒就跑完。
要放進 MP4 的話,字幕編碼必須用 mov_text——MP4 容器不吃 SRT 格式:
ffmpeg -i input.mp4 -i subtitle.srt -c copy -c:s mov_text output.mp4
要加上語言標記與預設開啟:
ffmpeg -i input.mkv -i zh.srt -c copy -c:s srt \
-metadata:s:s:0 language=chi -disposition:s:0 default output.mkv
用 subtitles 濾鏡。因為畫面被改動,一定會重新編碼:
ffmpeg -i input.mp4 -vf "subtitles=subtitle.srt" -c:a copy output.mp4
-c:a copy 讓音訊直接複製、不重壓,可以省下一些時間也避免音質損失。
SRT 沒有樣式資訊,ffmpeg 會套用預設值(常常是不含中文的字型,導致方框或豆腐字)。
用 force_style 指定:
ffmpeg -i input.mp4 -vf "subtitles=zh.srt:force_style='FontName=Noto Sans TC,FontSize=24,PrimaryColour=&H00FFFFFF,OutlineColour=&H00000000,Outline=2,MarginV=30'" -c:a copy output.mp4
這裡的參數名稱與顏色格式沿用 ASS 的樣式定義,
所以 &H00FFFFFF 是不透明的白色(BGR 順序)。
Outline=2 給字加描邊,這在淺色畫面上很重要,
不然白字會整段看不見。
如果字幕本身是 ASS 且帶有樣式,要用 ass 濾鏡而不是
subtitles,才會保留原本的排版與特效:
ffmpeg -i input.mp4 -vf "ass=subtitle.ass" -c:a copy output.mp4
subtitles= 的參數會經過濾鏡語法解析,Windows 的反斜線與磁碟機
冒號都是特殊字元,直接寫絕對路徑常常會失敗。最省事的做法是
cd 到字幕檔所在目錄後只寫檔名。若一定要寫完整路徑,
反斜線要寫成 \\\\、冒號要寫成 \\:。
使用桌面版 Chrome 或 Edge,就能在字幕編輯器直接把字幕燒進 mp4;
影片全程留在你的瀏覽器、不會上傳,而且免費。透明背景 .mov
仍是本機版功能,適合要丟進剪輯軟體再疊片的工作流。
如果還沒有字幕檔,字幕醬 可以從影片語音直接辨識並翻成繁體中文, 先在編輯器校對,再下載 SRT、VTT、ASS 或 FCPXML;需要雙語(中文加原文)也能一次輸出。
延伸閱讀:SRT、VTT、ASS 差在哪、 字幕時間軸跑掉怎麼校正。