繁體中文

視訊與字幕·字幕工具包

為什麼字幕檔在 VLC 中播放但在 HTML5 軌道元素中失敗

· 工作原理

字幕 webvtt 瀏覽器處理

一個字幕檔到達兩個解析器,寬鬆的顯示每個提示,嚴格的顯示提示被丟棄的間隙
原始 ToolAcre 向量圖

桌面玩家很寬容;瀏覽器的 track 元素不是。這篇文章解釋了 HTML5 標題解析器如何讀取 WebVTT 檔案、它默默丟棄的錯誤以及如何準備兩者都接受的檔案。

相同的檔案在 VLC 中工作,但在網頁上沒有顯示任何內容 — 兩個解析器,兩個容差級別

在桌面播放器中正確播放且在網頁上不顯示任何內容的字幕檔案在兩者之間沒有變化。改變的是讀者带來的宽容程度。桌面播放器旨在顯示用戶向其拖曳的任何內容,以便它們猜測、修復和跳過。 HTML5 track 元素實作了一個規範,而接受猜測的規範不會是一個。

两者的差异都不是錯誤。這是兩種具有不同義務的設計,實際結果是桌面播放器無法很好地測試檔案是否可以在網路上執行。

track 元素如何載入字幕檔 - 請求、MIME 類型、跨來源軌道的 CORS 和 WEBVTT 標頭檢查

track 元素將字幕檔案作為普通資源獲取,這意味著它與任何其他請求遵循相同的規則。它必須使用 WebVTT 媒體類型提供,並無論其內容如何,作為純文字提供的檔案都會被拒絕。託管在另一個來源上的軌道需要跨來源標頭和視訊元素上的跨來源屬性,如果沒有它們,在進行任何解析之前獲取都會失敗。

然後是標題檢查。 WebVTT 檔案必須以 WEBVTT 簽章開頭,前面可以選擇一個位元組順序標記,沒有它的檔案不是 WebVTT 檔案。這是重新命名為 VTT 副檔名的 SRT 檔案不顯示任何內容的最常見原因:重新命名更改了副檔名,而不是第一行。

逐一提示解析 — 瀏覽器如何處理格式錯誤的時間碼或意外的行,以及為什麼失敗是無聲的

在該點之後的解析是逐個提示的,而失敗模式則讓它變得混亂。解析器無法讀取的區塊將被丟棄並繼續解析。沒有異常,沒有控制台錯誤,也沒有視覺指示;提示根本不會出現。九百個時間碼中有四個格式錯誤的檔案幾乎可以完美播放,其中有四個沉默時刻,看起來像是缺少翻譯而不是格式錯誤。

這就是為什麼該症狀通常被報告為間歇性的。沒有什麼是斷斷續續的。相同的提示每次都會失敗,但由於周圍的提示起作用,該檔案看起來大致有效,並故障歸因於內容而不是解析。

桌面播放器的寬大處理 - 為什麼 VLC 和其他人接受技術上無效的檔案

桌上玩家故意採取相反的立場。他們接受兩種毫秒分隔符,容忍丟失的索引行,從內容而不是擴展名推斷格式,修復順序,並跳過他們無法使用的內容而不抱怨。將檔案拖曳到播放器上的使用者希望電影有字幕,而不是驗證報告。

工具包解析器在輸入上採用同樣寬鬆的傳統,接受可選的時間、分隔符號和區塊不規則的檔案。不同之處在於它之後所做的事情:它將它所容忍的每一個錯誤記錄為一個定位問題,並寫回一個規範的形狀,而不是保留它所接受的不規則性。

工作範例:具有三個常見錯誤的檔案 - 在瀏覽器中測試它並查看哪些提示消失

取一個存在三個錯誤的檔案:它缺少 WEBVTT 標頭,一個提示的秒欄位為 75,以及一個提示在開始之前就結束了。在桌面播放器中播放檔案時,不可能的幾秒鐘會被修復或安靜地跳過,並反向提示會閃爍或被丟棄。觀眾看到字幕。

在軌道元素中,遺失的標頭立即結束;沒有顯示任何提示,因為該檔案從未被接受為 WebVTT。新增標題和圖片變化:大多數提示出現,七十五秒的提示在解析過程中被丟棄,反向提示被解析但從未顯示,因為它沒有持續時間可顯示。驗證在載入頁面之前命名,報告不可能的時間碼和在開始之前結束的提示,每個都按編號。

這不包括什麼 - 使用 ::cue 進行樣式設定、定位設定和即時字幕

這涵蓋了提示是否加載,而不是它們的外觀。透過提示偽元素進行樣式設定、時間碼行上的定位和對齊設定、區域定義和垂直文字都是單獨的問題,只有在檔案解析後才有意義。不顯示任何內容的檔案不是樣式問題,樣式也無法解決它。

即時和串流字幕也不在此範圍內。與自適應流一起交付的分段字幕軌道有自己的交付模型,並軌道元素加載的靜態檔案並不是它們到達播放器的方式。

重點:為最嚴格的解析器做好準備 — 字幕工具包的轉換和清理如何產生軌道元素接受的檔案

準備使用最嚴格的解析器而不是最寬容的解析器,因為嚴格的解析器是您的受眾使用的解析器。正確轉換為 WebVTT,以便寫入簽章行而不是假定的簽章行,使用正確的媒體類型為其提供服務,並在檔案位於另一台主機上時新增跨網域標頭。

在出貨前執行轉換並閱讀報告的問題。轉換器使用格式所需的分隔符號寫入規範時間戳,連續重新編號提示並報告它必須容忍的錯誤,這是在瀏覽器中默默消失的提示列表。然後重新載入頁面並將提示計數與來源進行比較,而不是相信字幕出現。