跳至主要內容
SubtitleMatrix

影片擷取字幕

媒體輸入影片裡的字幕

首次執行會下載字幕引擎 —— 約 31 MB,由本站提供,之後瀏覽器會快取。影片本身從不離開這個分頁。

這一頁拿一個影片檔,把裡面原本就有的字幕軌還給你,一條軌一個檔案,以軌道的語言命名。一個帶有英文 SDH 軌、中文軌與 PGS 圖像軌的 Matroska 檔,會輸出三個檔案:一個 .srt、另一個 .srt,以及一個 .sup。容器是被解封裝而不是重新編碼,所以文字軌是以檔案裡原本就有的位元組複製出來——不是從畫面重新打字,也不是重新對時。

工作在分頁裡發生。影片由本站自己提供、編譯成 WebAssembly 的 ffmpeg 讀取,唯一的網路請求就是那個引擎:第一次使用這個頁面時約 31 MB,之後由瀏覽器快取。影片本身從不被送到任何地方,這與本站其他每一頁遵循的是同一條規則,也是這一頁可以用在不允許離開本機的素材上的原因。

燒進畫面的字幕無法抽取,也沒有任何工具做得到,因為根本沒有軌道可讀——那些字就是像素。如果檔案完全沒有字幕串流,頁面會這樣說,而不是產出一個空檔案;燒進畫面的情況也算在內:一部看得到字幕、卻沒有字幕軌的影片,會被回報為沒有東西可抽取。

頁面在寫出任何東西之前,會列出它找到的每一條字幕串流:索引、編碼、語言、標題,以及該串流是否標為預設或強制。原本就活在自己容器裡的軌道會保留自己的格式——ASS 還是 ASS,WebVTT 還是 WebVTT——因為在這裡把它們轉成 SRT 會默默丟掉樣式,而未經要求就丟掉樣式,正是本站唯一不做的事。編碼沒有獨立容器的軌道(例如 MP4 裡的 mov_text 軌)會被重新編碼成 SRT,結果卡片會如實說明,而不是讓它冒充成複製。

位元圖軌輸出的是圖像,不是文字:PGS 串流變成 .sup,DVD 串流變成 .sub。這是刻意的——圖像就是檔案裡原本有的東西,猜它的文字是另一件工作,有自己的一頁與自己的語言問題。需要文字時,把 .sup 拿到 PGS 那一頁。

常見問題

可以拖進哪些影片容器?

MKV、MP4、M4V、AVI、MOV、TS、WebM、WMV、FLV、MPG 與 OGV。這份清單其實是隨附 ffmpeg 版本所帶的解封裝器清單,不是影片編碼清單:容器裡裝的是什麼編碼都無妨,字幕軌都是同一種串流。副檔名少見但本體是正常 Matroska 的檔案通常還是能用,因為解封裝器讀的是標頭而不是檔名;下載不完整或分段的檔案則常常不行,因為沒有索引可以走。

影片在讀取時會離開我的電腦嗎?

不會。唯一的下載是 ffmpeg 引擎本身,約 31 MB,由本站提供,第一次使用後由瀏覽器快取。你的影片被掛載進引擎在分頁裡的虛擬檔案系統,從那裡讀取;它從不被寫進任何請求內容。你可以在 Network 面板確認:處理檔案期間,沒有任何請求攜帶它。這個性質正是這一頁存在的原因——大多數抽取工具都先上傳,而處於法律或醫療保管下的素材不能上傳。

為什麼我拿到的是 .sup 檔而不是 .srt?

因為那條軌是以圖像儲存的,不是文字。PGS 串流(編碼 hdmv_pgs_subtitle)是一連串影像,而對影像串流誠實的抽取結果就是影像串流:一個 .sup,正是播放器與字幕編輯器期待的格式。要把它變成文字,得辨識每張圖裡的字母,那是另一頁,有自己的語言問題與校對步驟。抽取器從不發明它沒讀到的文字。

工具會怎麼處理沒有獨立檔案格式的軌道?

它會把那一條軌重新編碼成 SRT,並把結果標成重新編碼。常見的情況是 mov_text,也就是活在 MP4 裡的字母編碼:它沒有自己的檔案格式,所以把串流複製出來只會得到沒有東西打得開的位元組。重新編碼不是無損的——mov_text 可能攜帶的樣式與定位不會活下來——所以結果卡片會把它列為有損,而不是把檔案呈現成容器內容原封不動的副本。

有好幾條軌時,輸出的檔案怎麼命名?

以影片自己的名稱加上軌道的語言代碼:一個叫 documentary.mkv 的檔案,其英文軌會變成 documentary.eng.srt。兩條軌共用同一語言時——一般英文軌與英文 SDH 軌,這很常見——第二條會變成 documentary.eng-2.srt,而不是蓋掉第一條。沒有語言標籤的軌會退回用串流索引,所以仍然區分得出來。若你拿到多個檔案,頁面會把它們打包成一個 zip,因為瀏覽器會阻擋頁面同時發起多個下載。

為什麼第一次執行比第二次久?

第一次執行會下載 ffmpeg 引擎,約 31 MB。進度列涵蓋那段下載,之後才是抽取本身。瀏覽器會快取引擎,所以同一個頁面之後的執行幾乎立刻開始;重新整理後也一樣,只要快取沒有被清除。引擎分成四塊提供,因為託管平台不接受超過 25 MiB 的單一檔案,而頁面會在開始前於記憶體中把它們組回去——那段重組也是第一次等待的一部分。

可以取消一場跑太久的執行嗎?

可以。取消按鈕會停下正在跑的抽取,並終止執行它的 worker,所以大檔案不會在你決定不等之後繼續佔用一個核心。取消不是錯誤:項目會回到可以重試的狀態,下一次執行會啟動新的 worker。不會把任何半成品當成下載提供,因為一份看起來完整、其實只寫了一半的字幕檔,比沒有檔案更糟。

相關工具