BaseAudioContext: state 属性
BaseAudioContext 接口的只读属性 state 返回 AudioContext 的当前状态。
值
一个字符串。可能的值是
closed-
音频上下文已关闭(通过
AudioContext.close()方法)。 interrupted-
音频上下文已被 Web 应用控制之外的事件中断。
running-
音频上下文正常运行。
suspended-
音频上下文已暂停(通过
AudioContext.suspend()方法)。
描述
音频上下文的 state 属性用于暴露其当前的运行状态。这通常通过在 statechange 事件处理程序中查询 state 来实现,以便可以适当地响应状态的变化。
running 和 closed 值不言自明——它们表示音频上下文正在正常运行,或者已关闭(通过 AudioContext.close() 方法)。
interrupted 和 suspended 状态都表示一个可以稍后恢复的“暂停”状态,但它们的含义有所不同。
suspended状态表示音频上下文响应 Web 应用内的用户操作而暂停,通过在click(或类似)事件处理程序中运行AudioContext.suspend()方法。在这种情况下,上下文将通过运行AudioContext.resume()方法来恢复。interrupted状态表示音频上下文响应 Web 应用控制之外的中断而暂停。在这种情况下,浏览器决定何时暂停和恢复应用程序。然后,Web 应用可以适当地处理interrupted状态,例如通过暂停音频流以避免在不使用应用程序时浪费资源。
可能触发 interrupted 状态的中断包括
- 同一系统上的会议或电话应用程序需要独占访问设备的音频硬件。
- 用户关闭了他们的笔记本电脑。
- 用于启动或响应音频中断的 API 功能。
注意: interrupted 状态的触发方式可能因浏览器而异。
另请注意 interrupted 和 suspended 状态之间可能发生的转换
- 如果在中断期间(
state为interrupted)对音频上下文调用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 |
浏览器兼容性
加载中…