廣告插播或編碼器重新啟動後 HLS 音畫不同步:排查指南

透過比較時間戳、不連續序列、位元率變體和瀏覽器播放證據,追查 HLS 在廣告插入或編碼器重新啟動後出現的音畫不同步。

廣告結束、頻道切換或編碼器重新啟動後,人物說話與嘴型對不上。這個現象本身不能指出故障原因:播放清單邊界可能不正確,音訊和視訊時間戳可能分歧,某個變體可能未對齊,或者播放器實際輸出的音軌不是你正在檢查的那一條。

可靠的排查方式是先在音訊與視訊媒體播放清單中對齊相同時間點,再將這些時間點與解析出的時間戳和播放事件連結起來。只檢查你擁有或獲准測試的串流。分享記錄前請移除簽章 URL、金鑰、Cookie、權杖、觀眾識別碼和私人主機名稱。

*驗證方法 — 2026 年 9 月 26 日:*我們使用 Node.js 24.12.0,對合成的視訊/音訊呈現時間戳和不連續序列號執行確定性測試。測試確認:拼接前後偏差穩定在 40–60 毫秒;偵測到一個合成音訊偏差增加 500 毫秒的案例;並區分音訊和視訊共用時鐘重設的情況。它只驗證測試中的算術與檢查點配對,沒有解析傳輸串流或 fMP4、執行編碼器、插入廣告、測試瀏覽器/播放器/裝置,也沒有建立通用的音畫可接受閾值。測試檔案:scripts/test-hls-av-sync-fixture.cjs。

先判斷「不同步」指的是什麼

先觀察偏差是固定的、逐漸累積的,還是只在某個邊界突然出現。也要記錄目前選取的音訊變體,以及是否同時切換了視訊畫質。

現象優先驗證的假設比較證據
拼接前後偏差相同原本就存在的編碼或輸出路徑偏差邊界前較早時間點的音畫配對時間戳
廣告或重新啟動邊界後偏差突變拼接時間映射錯誤,或時間軸重設未標記最後一個正片片段與第一個插入/重新啟動後片段
節目播得越久偏差越大時鐘速率或時間戳推進不一致跨多個檢查點比較,而不只看片段起點
只有一個畫質變體不同步特定變體的時間或多工封裝問題各視訊播放清單中相同內容時間點
只有一條語言音軌不同步替代音軌封裝或時間戳對齊問題同一視訊變體對應的音訊播放清單
瀏覽器跳轉或切換音軌後偏差改變可能與播放器緩衝/切換路徑有關已解析的媒體時間戳、播放器事件和目前音軌 ID

尚未判定屬於哪一種型態之前,不要先調整音訊延遲。固定補償可能掩蓋拼接缺陷,反而使其他片段出現錯位。

對齊相同時間點,不要只比片段編號

媒體序列號代表播放清單中的位置,不保證音訊和視訊中相同編號的片段涵蓋同一時刻。若節目日期時間存在且明確無歧義,可用來對齊;也可以比較節目/廣告邊界、片段呈現區間與不連續序列號。直播播放清單會持續滑動,因此也要記錄播放清單快照及擷取時間。

每個檢查點都記下:選取的視訊變體與音訊變體/群組;已去識別化的片段 URI、媒體序列號、不連續序列號、片段長度及節目日期時間;獲准使用的媒體分析工具回報的起訖呈現時間戳;該邊界是否有 EXT-X-DISCONTINUITY;廣告後第一個正片片段與編碼器重新啟動後第一個片段;解多工器回報的時間戳回繞、重設、缺口、重疊或軌道切換。

將原始媒體存放在有權限控管的環境中。診斷報告通常只需要時間戳和片段標籤,不需要媒體本身或可重複使用的 URL。

檢查所有變體的不連續標記

RFC 8216 定義 EXT-X-DISCONTINUITY-SEQUENCE,讓用戶端在不同播放清單含有不連續標記時,同步同一變體串流的不同呈現版本。Apple 的製作規範指出,編碼連續性中斷必須標記不連續,而且所有變體與呈現版本都必須在相同時間點標記。若只在其中一份播放清單加上標記,即使每份清單單獨看來都合理,切換時仍可能產生歧義。

在每個廣告拼接或編碼器重新啟動處,比較相關的視訊播放清單和每一條可選音訊播放清單。確認不連續計數和邊界指向相同節目時間點,不要只比標籤所在的行號。若滑動直播清單移除了較早的不連續標記,請確認序列基準值有一致遞增。若使用 EXT-X-PROGRAM-DATE-TIME,也要檢查邊界附近的時間映射是否有歧義。

同時檢查媒體時間軸本身。播放清單標記只會宣告邊界,不會修復跳動半秒的音訊時間戳,也不會自動把使用另一個時鐘的視訊軌道對齊。對 fMP4,除了呈現時間戳,也要檢查解碼時間的連續性;對 MPEG-TS,則要檢查拼接前後的時間戳推進和連續計數器。

沿播放器路徑追蹤第一個異常邊界

若使用基於 MSE 的 hls.js 路徑,記錄函式庫版本、畫質與音軌切換、片段載入/解析事件、錯誤,以及目前版本提供的 LEVEL_PTS_UPDATED 資料。將這些事件與 video.currentTime、支援時的 video.audioTracks 和實際聽到/看到的症狀對照。原生 HLS 可能不公開相同內部資料,請改用它能提供的診斷資訊並標明缺少哪些證據。

不要把解多工後的 PTS 誤當作牆上時鐘。播放器事件要用單調時鐘計時,媒體時間戳則分開記錄。如果問題只在從背景返回時發生,可能是舊緩衝仍在播放,或直播視窗已經過期;請參考背景播放復原指南。若同時遇到播放停頓,可看HLS 緩衝問題診斷。

使用可控的重現矩陣

對獲准測試的串流和插播流程,重複播放相同片段集合,每次只改變一個條件:

案例可隔離的問題
不插廣告,編碼器持續運作基準音畫時間關係
插入廣告但沿用同一編碼器時鐘不重設時鐘時的拼接映射
不插廣告,只重新啟動編碼器重新啟動和不連續處理
插入廣告並重新啟動編碼器拼接與時間戳重設的交互作用
每個視訊變體搭配相同預設音訊位元率變體的對齊狀況
固定視訊變體,輪替各替代音軌音訊呈現版本的對齊狀況
在邊界兩側跳轉並切換音軌播放器轉換行為

在每次轉換處保存播放清單快照與獲准使用的分析輸出。比較邊界前最後一段正常區間、邊界後第一段,以及後續數個區間。若偏差只跳動一次而後維持不變,調查拼接時間映射;若持續擴大,調查時鐘推進;若只有單一變體不同,應修正該變體的封裝流程,而非套用全域播放器延遲。

在負責此問題的層級修復

  • **邊界缺漏或播放清單彼此不一致:**修正播放清單產生方式,以及所有受影響變體/呈現版本的不連續序列。
  • **只有插入媒體的時間戳跳動:**修正封裝器或廣告拼接器的時間戳映射,並驗證邊界兩側。
  • **單一軌道的偏差逐漸累積:**檢查該軌的編碼時鐘、樣本定時和多工封裝,不要補償所有變體。
  • **只有播放器切換時才重現:**縮小成獲准使用的最小案例,記錄精確函式庫/瀏覽器版本和事件,再調查緩衝或重新多工封裝行為。
  • **只有直播復原時才重現:**更新播放清單,先確認目前可搜尋視窗,再恢復位置;不要盲目套用過期的絕對 currentTime。

修正後重新測試邊界前後的完整區間、所有支援的變體、音軌切換和跳轉路徑。如果某個偏差是刻意設計的,應在正確的輸出階段記錄與管理,不要把它藏在使用者播放器的永久延遲設定中。

報告證據,不要超出證據下結論

一份有用的報告會說明目前音訊/視訊軌道、邊界型態、播放清單序列值、邊界前後的時間戳偏差及後續變化、播放器路徑和版本,以及明確的重現案例。確定性測試、靜態播放清單檢查、分析工具測量和實體播放各自回答不同問題,請分別標示。

主要參考資料

從音畫時間關係第一次改變的那個邊界開始追查。把播放清單的不連續標記、變體定時、已解析時間戳和播放器事件放在一起,才能判斷責任在封裝器、廣告拼接器、編碼器、播放器切換路徑,還是直播復原邏輯。