本頁說明評估輸入和輸出延遲時間的常用方法。
測量輸出延遲時間
有幾種方法可用來評估輸出延遲時間,詳情請參閱下文,瞭解各項方法的準確度和執行難易度。如需測試環境範例,請參閱「測試電路」。
LED 和示波器測試
這項測試會測量與裝置 LED 指示燈相關的延遲時間。如果正式版裝置沒有 LED,您可以在原型機裝置上安裝 LED。如要進一步提高原型裝置 (含有外露電路) 的準確度,請將示波器探針直接連接至 LED,以便略過光線感應器的延遲時間。
如果您無法在正式版或原型版裝置上安裝 LED,請嘗試下列因應措施:
- 使用通用輸入/輸出 (GPIO) 接腳來達到相同目的。
- 使用 JTAG 或其他偵錯埠。
- 使用螢幕背光。這可能會帶來風險,因為背光會產生不可忽視的延遲,並可能導致讀取的延遲時間不準確。
如要進行這項測試:
- 執行應用程式,讓應用程式在輸出音訊的同時,定期閃爍 LED 燈。
注意:如要取得實用的結果,請務必在測試應用程式中使用正確的 API,以便測試快速音訊輸出路徑。如要瞭解背景資訊,請參閱「減少延遲時間的設計」。
- 將光線感應器放在 LED 旁邊。
- 將雙通道示波器的探針連接至有線耳機插孔 (線路輸出) 和光源感應器。
- 使用示波器測量觀察線輸出訊號與光線感應器訊號之間的時間差異。
假設 LED 延遲和光線感應器延遲都為零,則時間差就是大致的音訊輸出延遲時間。一般來說,LED 和光線感應器的延遲時間都相當短,大約為 1 毫秒或更短,因此可以忽略。
測量往返延遲時間
往返音訊延遲是指輸出延遲和輸入延遲的時間總和。
拉森測試
最簡單的延遲時間測試之一,就是音訊回饋 (拉森效應) 測試。這項測試會以脈衝回應迴圈的時間,粗略測量輸出和輸入延遲時間。由於這項測試的性質,因此單獨使用這項測試進行詳細分析並不實用,但可用於校正其他測試,以及建立上限。
此方法不會細分元件時間,這在輸出延遲時間和輸入延遲時間不同時非常重要。因此,不建議使用這種方法單獨測量輸出延遲或輸入延遲的確切值,但用於建立粗略估算值時可能會很實用。
輸出至裝置上喇叭的延遲時間可能比輸出至耳機連接器的延遲時間長得多。這是因為需要校正和保護喇叭。
如要進行這項測試:
- 執行應用程式,擷取麥克風的音訊,並立即透過喇叭播放擷取的資料。
- 在麥克風外製造聲響,例如敲擊麥克風旁的鉛筆。這類噪音會產生意見回饋循環。或者,您也可以使用軟體將脈衝注入迴圈中。
- 測量回饋脈衝之間的時間,即可取得輸出延遲、輸入延遲和應用程式額外負載的總和。
以下提供一些資源,協助您取得 Larsen 測試的應用程式:
- Rick O'Rang 迴送應用程式是用於音訊回饋測試的 Android 應用程式。您可以 從 Google Play 下載應用程式,或 從 GitHub 取得原始碼。
-
我們也已在 slesTestFeedback.cpp 中發布實作範例。這是一個指令列應用程式,並使用平台建構環境建構;不過,採用其他環境的程式碼應該很簡單。您也需要
audio_utils
程式庫中的非阻斷式 FIFO 程式碼。
音訊迴送 Dongle
Rick O'Rang 音訊回送 Dongle 可用於透過耳機連接器測量往返延遲時間。下圖顯示將一次衝量注入迴圈,然後讓迴圈振盪的結果。振盪週期就是往返延遲時間。這裡未指定特定裝置、軟體版本和測試條件。請勿推測顯示的結果。

圖 1. 往返時間評估
您可能需要移除 USB 傳輸線來降低噪音,並調整音量以獲得穩定的震動。
測量輸入延遲時間
輸入延遲時間比輸出延遲時間更難評估。以下測試可能有所幫助。
一種方法是先使用 LED 和示波器方法判斷輸出延遲時間,然後使用音訊回饋 (Larsen) 測試,判斷輸出延遲時間和輸入延遲時間的總和。這兩項測量值的差異就是輸入延遲時間。
另一種做法是在原型裝置上使用 GPIO 針腳。在外部,請在向裝置提供音訊訊號的同時,脈衝 GPIO 輸入。執行應用程式,比較 GPIO 信號和音訊資料的到達時間差異。
減少延遲時間
如要降低音訊延遲,請特別留意整個系統的排程、中斷處理、電源管理和裝置驅動程式設計。您的目標是避免平台的任何部分阻斷 SCHED_FIFO
音訊執行緒超過幾毫秒。採用這種系統化方法,您就能減少音訊延遲,並獲得整體效能更可預測的附加好處。
音訊不足的情況通常只會在特定情況下或在轉場時發生,而且很難偵測。請嘗試啟動新應用程式,並快速捲動各種畫面,以便測試系統。但請注意,某些測試條件會造成過大的負載,超出設計目標。舉例來說,擷取錯誤報告會對系統造成極大負載,因此在這種情況下,發生未執行的情況可能就屬於可接受的範圍。
測試未執行完的情況時:
- 在應用程式處理器之後設定任何 DSP,以便盡可能減少延遲時間。
- 在不同情況下執行測試,例如螢幕開啟或關閉、USB 插入或拔除、Wi-Fi 開啟或關閉、藍牙開啟或關閉,以及電話和資料無線電開啟或關閉。
- 選取你非常熟悉且容易聽到未執行的相對安靜音樂。
- 使用有線耳機可提高靈敏度。
- 請適度休息,避免「耳朵疲勞」。
找出導致不足的根本原因後,請減少緩衝區計數和大小,以便充分利用這項功能。在分析緩衝區不足情形和修正緩衝區不足的原因之前,就急著減少緩衝區計數和大小的做法,只會讓人感到挫折。
工具
systrace
是一款用於診斷系統層級效能異常的絕佳通用工具。
dumpsys media.audio_flinger
的輸出內容也包含一個實用的部分,稱為「簡易移動統計資料」。這裡提供各個音訊混合和 I/O 週期的經過時間變化情形摘要。在理想情況下,所有時間測量值應大致等於平均值或標稱週期時間。如果您看到極低的下限或極高的上限,表示可能有問題,可能是排程延遲時間過長,或是中斷停用時間過長。輸出內容的尾端部分特別實用,因為它會強調超過 +/- 3 標準差的變化。