字幕位置調整
或者貼上字幕文字
選項
九個預設格位,外加一個移除選項。寫出的標記是數值鍵盤順序的 {\anN} —— 7/8/9 是頂列,4/5/6 是中列,1/2/3 是底列 —— 它放在每條字幕第一行的前面。ASS 和 SSA 會把它讀成真正的對齊代碼;在 SRT 裡它是字面文字,libass、VLC 和 mpv 會照做,更簡單的播放器則原樣印出。既有的 \pos 座標永遠不會被改動。選擇最後一項則去掉位置標記,而不是加上一個。
這一頁把字幕檔裡的每一條字幕搬到九個螢幕位置之一,或把已經帶位置的檔案的標記清掉。它會在每條字幕第一行開頭寫一個 `{\anN}` 對齊碼,N 的編號方式跟數字鍵盤一樣:`7` `8` `9` 在上排,`4` `5` `6` 在中間,`1` `2` `3` 在下排。那個排法不是閱讀順序,而頁面自己的例子存在的主要目的,就是讓人不可能想選左上卻不小心選到左下。
這個標記是三種格式唯一有共識的位置寫法。在 ASS 與 SSA 上它是合法的覆寫碼,會讀回字幕自己的欄位,並在 `\pos` 之後按文件規定的順序重新寫出——所以一份從頭到尾不離開 ASS 的檔案,往返後完全一樣。SRT 完全沒有位置語法,標記因此以字面文字寫在行首:VLC、mpv 這類 libass 播放器認得它,不認得的播放器則會把這四個字元印在畫面上。頁面把這件事講明白,而不是承諾它保證不了的位置。
位置被當成整條字幕的屬性,所以即使一條字幕有兩三行,標記也只放在第一行前面。既有的 `\pos(x,y)` 不會被動:像素座標把字幕釘在一種螢幕尺寸上,換一個尺寸就壞,而對齊碼讓播放器自己算位置;再者,把別人手動定位過的字幕搬走,也不是這一頁被要求做的事。
在位置清單裡選「移除」是一個真的指令,不是第十個位置。它把每條字幕開頭的標記與存下來的對齊一起剝掉——這是把一份 SRT 恢復成不帶標記的原始樣貌的唯一方法——而寫在行中間的標記會留在原處,因為那個是對白,不是定位。檔案不上傳,時間碼永遠不動。
範例
兩條純 SRT 字幕搬到上方置中
輸入
1
00:00:01,000 --> 00:00:02,000
Hello there.
2
00:00:03,000 --> 00:00:04,000
Second line.
輸出
1
00:00:01,000 --> 00:00:02,000
{\an8}Hello there.
2
00:00:03,000 --> 00:00:04,000
{\an8}Second line.
`\an8` 是上排中間那一格——數字鍵盤最上面一排的中間鍵。標記放在文字開頭而不是自己一行,時間碼、字幕編號與空行都沒動,所以檔案仍是合法的 SRT,只是每條多了四個字元。
同一份檔案放到左上角與左下角
輸入
1
00:00:01,000 --> 00:00:02,000
Hello there.
輸出
1
00:00:01,000 --> 00:00:02,000
{\an7}Hello there.
左上角是 `7`,左下角是 `1`——差了六格,因為編號跟的是數字鍵盤而不是閱讀順序。這是最常被人手寫錯的對應,也是九個預設值在這頁各有一個例子的原因:一位數字寫反,除了有人真的看影片之外根本看不出來。
搬動一條原本就在左上角的 ASS 字幕
輸入
[Script Info]
ScriptType: v4.00+
[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,Arial,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1
[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:01.00,0:00:02.00,Default,,0,0,0,,{\an7\i1}Hello there{\i0}
輸出
[Script Info]
ScriptType: v4.00+
[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,Arial,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1
[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:01.00,0:00:02.00,Default,,0,0,0,,{\an2}{\i1}Hello there{\i0}
舊的 `\an7` 會在新值寫入前先清掉,所以這條字幕只帶一個對齊而不是兩個——重複的話播放器會取最後一個,而那是這次執行裡沒有人選過的值。斜體那一對留在原位。在 ASS 上標記是真的覆寫碼,所以這裡沒有任何東西會以文字形式出現在畫面上。
從一份有兩種標記的檔案裡移除標記
輸入
1
00:00:01,000 --> 00:00:02,000
{\an8}Hello there.
2
00:00:03,000 --> 00:00:04,000
{\an2}Second line.
輸出
1
00:00:01,000 --> 00:00:02,000
Hello there.
2
00:00:03,000 --> 00:00:04,000
Second line.
「移除」剝掉的是原本就存在的任何標記,而不是你原本會選的那個預設,也不會寫回任何東西。經過這次執行的檔案會落在播放器自己的預設位置,這正是重點:那是從標記回到純文字的唯一一條路,因為「沒有位置」本身就是一種位置的表達。
常見問題
`{\an1}` 在螢幕的哪個位置,為什麼不是從左上角開始編?
`1` 是左下角。九個值跟數字鍵盤一樣:`7` `8` `9` 是上排,`4` `5` `6` 是中排,`1` `2` `3` 是下排。所以左上角是 `7`、置中是 `5`、右下角是 `3`。頁面的位置清單按閱讀順序寫,再替你翻成這些數字,這正是用它而不是手改標記的主要理由。
字幕位置修改支援 WebVTT、SAMI 或 TTML 檔嗎?
不支援,接受的格式清單是刻意短的:只有 SRT、ASS 與 SSA。WebVTT 與 TTML 有自己的定位語法——`line:`、`align:` 這類 cue 設定,或 `tts:` 屬性——這一頁不寫那些;收下它們等於回報位置改了,而檔案原封不動地出來。同樣的理由也排除 JSON,它的位置欄位是五個水平值,不是九個格子。
SRT 檔裡的標記會以文字形式顯示嗎?
看播放器,而這一頁改變不了這件事。SRT 沒有位置語法,所以 `{\an8}` 是以普通字元存在行首。建在 libass 上的播放器——VLC 與 mpv 都是——會把它讀成對齊指令並照著擺;較簡單的播放器則當成文字,把那四個字元印在畫面上。要在每台裝置上都保證位置,只能把字幕燒進畫面,那已經超出字幕檔能做的事。
既有的 `\pos(x,y)` 會被新位置覆蓋嗎?
不會,`\pos` 原樣保留。像素座標與對齊碼是兩種不同的指令:`\an` 要求播放器依當下螢幕自己算位置,`\pos` 則把字幕釘在一種解析度上的某一點。移除手動放好的 `\pos` 等於撤銷別人刻意做的工作,所以這一頁只寫對齊、也只清掉先前的對齊,從不動座標。
一條字幕有兩行時,每行都會有自己的標記嗎?
只有第一行會拿到,因為位置屬於整條字幕,不屬於某一行。每行都放一個標記,最好的情況是累贅,在 ASS 上則是第二個覆寫區塊做著跟第一個一樣的事。移除時同一條規則反過來用:只有第一行最前面的標記會被剝掉,寫在句子中間的那個會被當成對白的一部分。
同一個位置套用兩次會怎樣?
什麼都不會——第二次執行產出逐位元組相同的檔案,並回報沒有任何字幕被改。頁面在寫入新標記前會先清掉既有的,所以重套一個已經有的預設值,等於移除再加回同樣四個字元。這在檔案要繞一輪審查時很重要:為了確認位置有套上而再跑一次,不會移動任何東西,下載到的仍是同一份檔案,而不是某處悄悄不同的副本。