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

浏览器兼容性

另见