TTML 轉 SBV
或者貼上字幕文字
這次轉換會改變什麼
有 3 項會被捨棄或需要你決定
- 樣式
全部樣式(粗體、斜體、顏色、外框、陰影)
- 定位
螢幕定位(每條字幕都會回到預設位置)
- 格式專屬內容
來源格式保留在字幕之外的內容(非字幕區塊、檔案標頭文字、單條字幕的設定、被註解掉的事件)——目標格式沒有地方存放它們
這份清單來自這兩種格式的能力矩陣,而不是你載入的這份具體檔案。如果具體檔案用到了格式允許、但矩陣沒有建模的特性,可能會遺失更多。
這一頁把 TTML 寫成 SBV:一行 `0:00:01.000,0:00:03.500` 加正文,兩條之間空一行,沒有序號也沒有表頭。每條 `<p>` 對應一條 SBV cue。
時間不丟。兩邊都到毫秒,時鐘寫法只差小時位的前導零:TTML 的 `00:00:01.000` 在 SBV 裡是 `0:00:01.000`。位移與影格寫法會先折算成時鐘,值本身不變。
丟的是樣式與定位:`<styling>` 的字型、字級、顏色、描邊、陰影、邊距,`<layout>` 的區域定義,`<metadata>`,命名空間與 `<p>` 上的 `style` / `region` 參照。段落內的強調保留為 `<b>`、`<i>`、`<u>`、`<font color="…">` 標籤——這是 cue 級格式還能帶的那部分樣式。一條兩行字幕寫成上下兩行,仍在同一條 cue;產物 UTF-8、LF、無 BOM。
範例
一份典型的 TTML 檔轉成 SBV
輸入
<?xml version="1.0" encoding="UTF-8"?>
<tt xmlns="http://www.w3.org/ns/ttml" xmlns:tts="http://www.w3.org/ns/ttml#styling" xml:lang="en">
<head>
<styling>
<style xml:id="s1" tts:color="#FFFF00" tts:fontWeight="bold"/>
</styling>
<layout>
<region xml:id="bottom" tts:origin="10% 80%" tts:extent="80% 20%"/>
</layout>
</head>
<body>
<div>
<p begin="00:00:01.000" end="00:00:03.500" region="bottom" style="s1">Hello <span tts:fontStyle="italic">there</span>.</p>
<p begin="00:00:03.500" end="00:00:06.000" region="bottom">How are you?<br/>Fine, thanks.</p>
</div>
</body>
</tt>
輸出
0:00:01.000,0:00:03.500
Hello <i>there</i>.
0:00:03.500,0:00:06.000
How are you?
Fine, thanks.
這個方向丟掉頭部的樣式表、區域表與定位參照;段落內的強調以標籤保留,時間碼精確到毫秒。
同一轉換遇到一份格式凌亂的檔案
輸入
<?xml version="1.0" encoding="UTF-8"?>
<tt xmlns="http://www.w3.org/ns/ttml" xmlns:tts="http://www.w3.org/ns/ttml#styling"
xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
ttp:frameRate="25" xml:lang="en">
<body>
<div>
<p begin="1.5s" dur="2s">Loaded from an offset and a duration.</p>
<p begin="4s" end="00:00:06.50">A coarser clock spelling.</p>
<p begin="00:00:07:00" end="00:00:08:12">Frames, at 25fps.</p>
<p begin="9s"><span tts:color="#FF0000">Half-open</span> and Tom & Jerry.</p>
</div>
</body>
</tt>
輸出
0:00:01.500,0:00:03.500
Loaded from an offset and a duration.
0:00:04.000,0:00:06.500
A coarser clock spelling.
0:00:07.000,0:00:08.480
Frames, at 25fps.
0:00:09.000,0:00:11.000
<font color="#FF0000">Half-open</font> and Tom & Jerry.
這一份混用了真實寫法:位移加時長、較粗的時鐘拼法、按影格寫的時間、實體,以及只有開始時間的半開 cue。可以看解析器把哪些寫法折進同一條時間軸。
常見問題
TTML 轉 SBV 的時間碼會丟毫秒嗎?
不會。SBV 寫三位小數,與 TTML 的毫秒一致;`00:00:04.126` 變成 `0:00:04.126`,只少了小時位的前導零。
TTML 轉 SBV 後,粗體和顏色還在嗎?
還在,寫成 `<b>` 與 `<font color="…">` 標籤。丟的是樣式表裡的全域字型、字級、描邊、陰影與邊距。
TTML 的 `<layout>` 區域在 SBV 裡怎麼表示?
沒有表示。SBV 沒有畫面位置欄位,`region` 參照與區域表一起被丟掉,每條 cue 回到播放器的預設位置。
TTML 轉 SBV 時一條兩行字幕怎麼寫?
時間碼下面直接換行,兩行都在同一條 cue 裡。SBV 沒有額外的分組語法。
TTML 轉 SBV 時,`<p>` 上的 `style` 與 `region` 參照去哪了?
被丟掉。它們是頭部定義的參照,SBV 只有時間與文字;頭部兩張表本身也沒有落點。
SBV 再轉回 TTML 會補回什麼嗎?
不會。反方向不再丟東西,但已經丟掉的樣式、定位與頭部構造無法從 SBV 重建,因為檔案裡沒有記錄它們。
TTML 轉 SBV 時,`begin="1.5s"` 這類位移寫法怎麼處理?
先換算成時鐘時刻,再寫成 SBV 的三位小數;值不變,變的只是拼法。
TTML 轉 SBV 後,cue 的順序會變嗎?
會依開始時間升序重排。來源若原本有序就照原樣輸出;亂序的檔案會被放回正確順序。
TTML 轉 SBV 的產物用什麼編碼?
UTF-8、LF、無 BOM;來源若是 UTF-16 或 Windows 單一位元編碼,會先解碼並在結果面板說明。