BaseAudioContext: state 屬性

Baseline 已廣泛支援

此特性已得到良好支援,可在多種裝置和瀏覽器版本上使用。自 2021 年 4 月起,所有瀏覽器均已支援此特性。

BaseAudioContext 介面的只讀屬性 state 返回 AudioContext 的當前狀態。

一個字串。可能的值是

closed

音訊上下文已關閉(透過 AudioContext.close() 方法)。

interrupted

音訊上下文已被 Web 應用控制之外的事件中斷。

running

音訊上下文正常執行。

suspended

音訊上下文已暫停(透過 AudioContext.suspend() 方法)。

描述

音訊上下文的 state 屬性用於暴露其當前的執行狀態。這通常透過在 statechange 事件處理程式中查詢 state 來實現,以便可以適當地響應狀態的變化。

runningclosed 值不言自明——它們表示音訊上下文正在正常執行,或者已關閉(透過 AudioContext.close() 方法)。

interruptedsuspended 狀態都表示一個可以稍後恢復的“暫停”狀態,但它們的含義有所不同。

  • suspended 狀態表示音訊上下文響應 Web 應用內的使用者操作而暫停,透過在 click(或類似)事件處理程式中執行 AudioContext.suspend() 方法。在這種情況下,上下文將透過執行 AudioContext.resume() 方法來恢復。
  • interrupted 狀態表示音訊上下文響應 Web 應用控制之外的中斷而暫停。在這種情況下,瀏覽器決定何時暫停和恢復應用程式。然後,Web 應用可以適當地處理 interrupted 狀態,例如透過暫停音訊流以避免在不使用應用程式時浪費資源。

可能觸發 interrupted 狀態的中斷包括

  • 同一系統上的會議或電話應用程式需要獨佔訪問裝置的音訊硬體。
  • 使用者關閉了他們的筆記型電腦。
  • 用於啟動或響應音訊中斷的 API 功能。

注意: interrupted 狀態的觸發方式可能因瀏覽器而異。

另請注意 interruptedsuspended 狀態之間可能發生的轉換

  • 如果在中斷期間(stateinterrupted)對音訊上下文呼叫 suspend(),狀態將立即轉換為 suspended
  • 如果在中斷期間對 suspended 音訊上下文呼叫 resume(),狀態將立即轉換為 interrupted
  • 如果音訊上下文處於 suspended 狀態時發生中斷,上下文不會轉換為 interrupted。除非對上下文呼叫 resume()(如前一點所述),否則不會發生此轉換。做出此選擇是為了避免向網頁公開過多的裝置資訊——例如,記錄每次筆記型電腦關閉都可能是一個隱私問題。

示例

處理狀態更改

以下程式碼段摘自我們的 AudioContext 狀態演示線上檢視)。onstatechange 處理程式用於在每次狀態更改時將當前狀態記錄到控制檯。

js
audioCtx.onstatechange = () => {
  console.log(audioCtx.state);
};

恢復 iOS Safari 中的中斷播放狀態

在 iOS Safari 中,當用戶離開頁面(例如,切換標籤頁、最小化瀏覽器或關閉螢幕)時,音訊上下文的狀態會變為“interrupted”,並且需要恢復。例如:

js
function play() {
  if (audioCtx.state === "interrupted") {
    audioCtx.resume().then(() => play());
    return;
  }
  // rest of the play() function
}

規範

規範
Web Audio API
# dom-baseaudiocontext-state

瀏覽器相容性

另見