字幕跟畫面對不上有三種不同的成因,症狀不一樣,解法也完全不同。 先判斷是哪一種,再動手改,才不會愈調愈亂。
| 症狀 | 成因 | 解法 |
|---|---|---|
| 從頭到尾都固定快(或慢)幾秒 | 字幕與影片的起點不同,例如影片版本多了片頭 | 整體平移 |
| 開頭還對得上,愈後面差愈多 | 影格率不同(常見 23.976 對上 25) | 按比例縮放時間軸 |
| 某一段開始才跑掉,前面正常 | 影片版本有剪掉或多出片段(廣告、審查刪節) | 分段平移 |
判斷方法很直接:記下影片開頭某句話的實際時間與字幕標的時間, 算出差值;再到影片結尾做一次同樣的事。 兩個差值一樣就是整體平移,差值愈來愈大就是影格率問題, 中間某處突然跳掉就是分段問題。
最單純也最常見。假設影片裡第一句台詞在 00:00:12.5 出現,
字幕檔卻寫 00:00:10.0,那字幕快了 2.5 秒,全部往後推 2.5 秒即可。
G 讓字幕延後 50 毫秒,H 提前。按住可連續調整。Z 延後、X 提前,每次 0.1 秒。Alt + ← / →。這種方式只影響本次播放,適合臨時看一次。要永久修正就得改檔案。
itsoffset 對整個輸入做時間位移,正值表示延後:
ffmpeg -itsoffset 2.5 -i input.srt -c copy output.srt
要提前就用負值 -itsoffset -2.5。
這個做法不重新編碼,只改時間碼,所以很快。
電影常見的 23.976 fps 與 PAL 地區的 25 fps 之間換算會讓時間軸整條伸縮。 這種偏移的特徵是開頭幾乎對得上,愈到後面差愈多, 一部兩小時的片子結尾可能差到好幾分鐘。
修正方式是把所有時間碼乘上一個係數。從 25 fps 的字幕改成 23.976 fps 的影片,
係數是 23.976 / 25 = 0.95904:
新時間 = 舊時間 × 0.95904
反方向(23.976 的字幕配 25 fps 的影片)則乘上 25 / 23.976 ≈ 1.0427。
實務上不用手算。Subtitle Edit 有「同步 → 變更影格率」功能,直接填來源與目標 fps 即可;也可以用「視覺同步」——指定影片開頭與結尾各一句對應的實際時間, 工具會自己算出縮放與位移量。這個方式的好處是同時修正比例與偏移, 而且不需要知道原始 fps 是多少。
影片被剪過(電視版剪掉片段、或多了廣告黑幕)時,字幕會在某個時間點之後 整段偏移,但前面完全正常。
這種只能分段處理:找出斷點,把斷點之後的所有字幕整體平移。 Subtitle Edit 可以框選一段字幕行後套用位移,只影響選取範圍。 如果影片被剪成好幾段,就要重複這個動作。
字幕檔通常是針對特定發行版本製作的。如果你的影片跟字幕來自不同版本 (例如劇場版與加長版、串流版與藍光版),時間軸可能根本無法用單純的平移或 縮放對上,因為兩者的內容剪輯點就不同。這種情況與其硬調,不如換一份對應版本的 字幕,或直接從影片重新產生字幕。
如果用字幕醬從影片直接產生字幕,先在編輯器看波形時間軸, 拖曳句子的起訖點;遇到靜音處可用磁吸切點,校對後再輸出,不必靠猜的方式逐句對齊。
上述所有方法都是在修「別人做的字幕」對上「你手上的影片」。 如果字幕從一開始就是從你這支影片的聲音辨識出來的,時間軸天生就是對的, 沒有平移或縮放的問題。
字幕醬 就是這個做法:直接讀你的影片、辨識語音、 翻成繁體中文,輸出的 SRT 時間碼來自這支影片本身。 對於找不到對應版本字幕的片子,這比反覆調時間軸省事。
延伸閱讀:SRT、VTT、ASS 差在哪、 怎麼把字幕壓進影片。