SBV 轉 JSON
或者貼上字幕文字
這次轉換會改變什麼
這個方向不會遺失內容 —— 來源格式的每一項特性在目標格式裡都有地方可去。
這份清單來自這兩種格式的能力矩陣,而不是你載入的這份具體檔案。如果具體檔案用到了格式允許、但矩陣沒有建模的特性,可能會遺失更多。
這一頁把 SBV 轉成本站的 JSON 結構:給腳本與流程讀的字幕表示,時間不做成時間碼字串,而是整數毫秒。轉換完全在瀏覽器裡執行,不會上傳。
這個方向不會遺失任何東西。產物是 `version` 加一個 `cues` 陣列:每段字幕有 `start`、`end`(整數毫秒)與 `lines` 陣列。SBV 的 `0:00:04.126` 讀進來就是 `4126`;兩行的字幕在 `lines` 裡是兩項,不會被拼成一段。`id` 欄位用來放格式自帶的識別碼,SBV 沒有這種語法,所以不會憑空長出 id。
單一檔案可以,整季影集也可以:佇列會依序處理,結果一起打包成一個 ZIP 下載。
範例
一份典型的 SBV 檔案轉成 JSON
輸入
0:00:01.000,0:00:03.500
The quick brown fox.
0:00:04.000,0:00:06.250
Jumps over the lazy dog.
0:00:07.000,0:00:09.000
Two lines here.
And a second one.
輸出
{
"version": 1,
"cues": [
{
"start": 1000,
"end": 3500,
"lines": [
"The quick brown fox."
]
},
{
"start": 4000,
"end": 6250,
"lines": [
"Jumps over the lazy dog."
]
},
{
"start": 7000,
"end": 9000,
"lines": [
"Two lines here.",
"And a second one."
]
}
]
}
這個方向沒有丟掉任何東西:左右兩欄逐行對照就知道了。
同一轉換遇到格式紊亂的輸入
輸入
0:00:02.000,0:00:04.000
Carriage-return line endings.
0:00:06.000,0:00:08.000
Indented timecode, no final newline.輸出
{
"version": 1,
"cues": [
{
"start": 2000,
"end": 4000,
"lines": [
"Carriage-return line endings."
]
},
{
"start": 6000,
"end": 8000,
"lines": [
"Indented timecode, no final newline."
]
}
]
}
真實檔案常見的損壞就是這樣——混合換行、散落的空白、留空的欄位。拿它和上面那份乾淨樣本對照,就能看出解析器容忍到什麼程度。
常見問題
SBV 轉 JSON 後,時間用什麼單位表示?
JSON 用整數毫秒。`0:00:04.126` 會寫成 `4126`,不經過時間碼字串,所以沒有舍入問題。
SBV 轉 JSON 為什麼是無損的?
SBV 只有字幕段落:兩個時間與一段文字。JSON 的每段 cue 恰好有 `start`、`end` 與 `lines`,能完整接住這三樣,所以有損說明是空的。
SBV 轉 JSON 後,cue 裡會有 id 嗎?
不會。結構有 `id` 欄位,但它用來放來源格式自帶的識別碼;SBV 沒有這種寫法,所以條目裡只有 `start`、`end` 與 `lines`。
SBV 轉 JSON 後,兩行的字幕會變成兩條 cue 嗎?
不會。兩行仍屬於同一條 cue,只是分別放進 `lines` 陣列的兩項。
SBV 轉 JSON 的產物結構長什麼樣?
一個 `version`(目前是 1)加一個 `cues` 陣列;每條 cue 是物件,時間是整數毫秒,文字是字串。產物是純 JSON,可以直接交給腳本。
SBV 轉 JSON 的產物要怎麼交給腳本使用?
直接 `JSON.parse` 即可:沒有註解、沒有尾逗號,`cues` 陣列可以逐條讀取,適合拿來做批次檢查或當成自己程式的輸入。