在 Chrome 中剖析網路音訊應用程式

瞭解如何使用 about://tracingAudion (Chrome 開發人員工具中的 WebAudio 擴充功能),在 Chrome 中剖析 Web Audio 應用程式的效能。

Hongchan Choi

您會看到這篇文章,可能是因為您正在開發使用 Web Audio API 的應用程式,並遇到非預期的錯誤,例如輸出內容出現爆音,或是您聽到非預期的聲音。您可能已經參與 crbug.com 討論,Chrome 工程師也可能已要求您上傳「追蹤資料」或查看圖表視覺化資料。本文說明如何取得相關資訊,以便我們瞭解問題,並最終修正問題的根本原因。

Web Audio 剖析工具

在 Chrome 開發人員工具中,有兩個工具可協助您剖析 Web Audio:about://tracingWebAudio 擴充功能。

何時使用 about://tracing

發生神秘的「錯誤」時。使用追蹤工具剖析應用程式,即可深入瞭解以下內容:

  • 特定函式呼叫在不同執行緒上花費的時間片段
  • 時間軸檢視畫面中的音訊回呼時間

這通常會顯示錯過的音訊回呼期限,或是可能導致音訊出現意外錯誤的大量垃圾收集。這類資訊有助於瞭解潛在問題,因此 Chromium 工程師經常會詢問這類問題,尤其是當無法在本機重現問題時。如需追蹤的一般操作說明,請參閱這篇文章

何時使用 Web Audio DevTools 擴充功能?

如要將音訊圖表視覺化,並即時監控音訊轉譯器的運作情形。音訊圖表是 AudioNode 物件的網路,用於產生及合成音訊串流,通常會變得複雜,但圖表拓樸結構是設計上不透明的。(Web Audio API 沒有節點/圖表檢視功能)。圖表中發生了一些變化,現在您聽不到任何聲音。接著,我們要透過偵聽進行偵錯。這項工作從來都很困難,如果音訊圖表更大,難度就會更高。Web Audio 開發人員工具擴充功能可協助您以圖表方式呈現資料。

有了這個擴充功能,您就能監控運算的顯示容量預估值,這項資訊可指出網路音訊轉譯器在特定顯示預算 (例如 48KHz 的約 2.67 毫秒) 下執行的情形。如果容量接近 100%,表示轉譯器無法在指定預算內完成工作,因此應用程式可能會出現異常。

使用 about://tracing

如何擷取追蹤資料

以下操作說明適用於 Chrome 80 以上版本。

為獲得最佳結果,請關閉所有其他分頁和視窗,並停用擴充功能。或者,您也可以啟動新的 Chrome 執行個體,或使用其他發布版本 (例如 Beta 版或 Canary 版) 中的其他版本。準備好瀏覽器後,請按照下列步驟操作:

  1. 在分頁中開啟應用程式 (網頁)。
  2. 開啟另一個分頁,然後前往 about://tracing
  3. 按下「錄製」按鈕,然後選取「手動選取設定」
  4. 在「記錄類別」和「預設停用的類別」部分,按下「無」按鈕。
  5. 在「記錄類別」部分中,選取下列項目:
    • audio
    • blink_gc
    • media
    • v8.execute (如果您對 AudioWorklet JS 程式碼效能有興趣)
    • webaudio
  6. 在「預設停用的類別」部分中,選取下列項目:
    • audio-worklet (如果您想知道 AudioWorklet 執行緒的起始位置)
    • webaudio.audionode (如果您需要每個 AudioNode 的詳細追蹤記錄)
  7. 按下底部的「錄影」按鈕。
  8. 返回應用程式分頁,然後重做觸發問題的步驟。
  9. 取得足夠的追蹤資料後,請返回「追蹤」分頁並按下「停止」
  10. 追蹤分頁會以圖形顯示結果。

    完成追蹤後的螢幕截圖。

  11. 按下「儲存」即可儲存追蹤資料。

如何分析追蹤資料

追蹤資料會以視覺化方式呈現 Chrome 的網路音訊引擎如何轉譯音訊。轉譯器有兩種不同的轉譯模式:作業系統模式工作區塊模式。每個模式都會使用不同的執行緒模型,因此追蹤結果也會有所不同。

作業系統模式

在作業系統模式中,AudioOutputDevice 執行緒會執行所有網路音訊程式碼。AudioOutputDevice 是來自瀏覽器音訊服務的即時優先順序執行緒,由音訊硬體時鐘驅動。如果您發現這個車道中的追蹤資料不規則,表示裝置的回呼時間可能不穩定。已知 Linux 和 Pulse Audio 的組合會發生這個問題。如需更多詳細資料,請參閱下列 Chromium 問題:#825823#864463

作業系統模式追蹤結果的螢幕截圖。

工作區塊模式

在工作模組模式中,其特徵是從 AudioOutputDevice 跳至 AudioWorklet 執行緒的一個執行緒,您應該會在兩個執行緒車道中看到對齊的追蹤記錄,如下所示。啟用工作片段後,所有網路音訊作業都會由 AudioWorklet 執行緒算繪。此執行緒目前不是即時優先執行緒。這裡常見的異常狀況是,垃圾收集或未達到算繪期限所造成的大阻斷。這兩種情況都會導致音訊串流出現故障。

工作模組模式追蹤結果的螢幕截圖。

無論是哪種情況,理想的追蹤資料都會以良好對齊的音訊裝置回呼呼叫,以及在指定的算繪預算內完成的算繪工作為特徵。以上兩張螢幕截圖就是理想追蹤資料的絕佳範例。

從實際案例中學習

範例 1:算繪工作超出算繪預算

下方螢幕截圖 (Chromium 問題 #796330) 是 AudioWorkletProcessor 中的程式碼耗時過長且超出指定的算繪預算的典型範例。回呼時間安排正常,但 Web Audio API 的音訊處理函式呼叫在下一個裝置回呼前未能完成工作。

這張圖表顯示因轉譯工作超出預算而導致音訊出現異常的情況。

選項:

  • 減少 AudioNode 執行個體的數量,以減輕音訊圖表的工作負載。
  • 減少 AudioWorkletProcessor 中程式碼的工作負載。
  • 提高 AudioContext 的基本延遲時間。

範例 2:工作群組執行緒上的大量垃圾收集

與作業系統音訊轉譯執行緒不同,垃圾收集是在工作群組執行緒上管理。也就是說,如果程式碼執行記憶體配置/解除配置 (例如新的陣列),最終會觸發垃圾收集作業,並同步阻斷執行緒。如果網路音訊作業和垃圾收集的工作負載大於指定的算繪預算,就會導致音訊串流出現異常。下圖為這類情況的極端例子。

垃圾收集作業導致的音訊故障。

選項:

  • 預先分配記憶體,並盡可能重複使用。
  • 使用以 SharedArrayBuffer 為基礎的不同設計模式。雖然這不是完美的解決方案,但許多網路音訊應用程式都會使用類似的模式搭配 SharedArrayBuffer 來執行密集的音訊程式碼。範例:

範例 3:AudioOutputDevice 的音訊裝置回呼訊號不穩定

音訊回呼的精確時間是網路音訊最重要的部分。這應該是系統中最準確的時鐘。如果作業系統或其音訊子系統無法保證穩定的回呼時間,所有後續作業都會受到影響。下圖為雜訊音訊回呼的範例。與前兩張圖片相比,每個回呼之間的間隔差異甚大。

比較不穩定和穩定回呼時間的螢幕截圖。

選項:

使用 Web Audio 開發人員工具擴充功能

您也可以使用專為 Web Audio API 設計的 DevTools 擴充功能。與追蹤工具不同,這項工具可即時檢查圖表和效能指標。

這項擴充功能必須從 Chrome 線上應用程式商店安裝。

安裝完成後,請開啟 Chrome 開發人員工具,然後按一下頂端選單中的「Web Audio」,即可存取面板。

螢幕截圖:如何在 Chrome 開發人員工具中開啟「Web Audio」面板。

Web Audio 面板包含四個元件:內容選取器、屬性檢查器、圖表檢視器和效能監視器。

Chrome 開發人員工具中的「Web Audio」面板螢幕截圖。

情境資訊選取器

由於網頁可能有多個 BaseAudioContext 物件,因此您可以透過這個下拉式選單選擇要檢查的內容。您也可以按一下左側的垃圾桶圖示,手動觸發垃圾收集作業。

屬性檢查器

側邊面板會顯示使用者選取的環境或 AudioNode 的各種屬性。系統不支援在 AudioParam 中檢查動態值。

圖表視覺化工具

這個檢視畫面會算繪使用者所選取的上下文目前的圖表拓撲。這項示意圖會即時動態變更。只要按一下視覺化報表中的元素,即可在屬性檢視器中檢視詳細資訊。

監控成效

只有在所選 BaseAudioContext 為即時執行的 AudioContext 時,底部的狀態列才會啟用。這個長條會顯示所選 AudioContext 的即時音訊串流品質,並每秒更新一次。提供下列資訊:

  • 回呼間隔 (毫秒):顯示回呼間隔的加權平均值/變異數。理想情況下,平均值應穩定,變異數應接近零。如果差異很大,表示系統層級音訊回呼函式有不穩定的時間,可能會導致音訊串流品質不佳。(請參閱上方的範例 3)。

  • 算繪容量 (百分比):當容量接近 100 百分比時,表示算繪器在特定算繪預算下執行的作業過多,因此您應考慮減少作業 (例如在圖表中使用較少的 AudioNodes 物件)。

您可以按一下垃圾桶圖示,手動觸發垃圾收集器。

舊版 WebAudio 開發人員工具面板

擴充功能現在是 Chrome Web Audio 團隊建議的方法,但舊版 WebAudio 開發人員工具面板也能使用。如要開啟這個面板,請按一下開發人員工具右上角的「三點」選單,然後依序選取「更多工具」和「WebAudio」

螢幕截圖:如何在 Chrome 開發人員工具中開啟 WebAudio 面板。

結論

音訊偵錯作業相當困難。在瀏覽器中進行音訊除錯更是難上加難。不過,這些工具可提供有關網頁音訊程式碼效能的實用洞察資訊,減輕您的痛苦。不過,在某些情況下,Chrome 或擴充功能可能會發生問題。請放心,你可以在 crbug.com 或擴充功能 Issue Tracker 回報錯誤。

相片來源:Jonathan Velasquez 在 Unsplash 上提供