AudioContext:setSinkId() 方法

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

实验性: 这是一项实验性技术
在生产中使用此技术之前,请仔细检查浏览器兼容性表格

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

AudioContext 接口的 setSinkId() 方法用于设置 AudioContext 的输出音频设备。如果未显式设置 sink ID,则会使用系统默认音频输出设备。

要将音频设备设置为与默认设备不同的设备,开发者需要获得访问音频设备的权限。如果需要,可以通过调用 MediaDevices.getUserMedia() 来提示用户授予所需权限。

此外,此功能可能会被 speaker-selection Permissions Policy 阻止。

语法

js
setSinkId(sinkId)

参数

sinkId

要设置为输出音频设备的设备的 sink ID。这可以接受以下任一类型的值:

String

一个代表 sink ID 的字符串,例如通过 MediaDevices.enumerateDevices() 返回的 MediaDeviceInfo 对象的 deviceId 属性检索到。

AudioSinkOptions

一个表示 sink ID 不同选项的对象。目前它只有一个属性 type,值为 none。设置此参数将使音频被处理而不通过任何音频输出设备播放。当您不需要与处理同步播放时,这是一个减少功耗的有用选项。

返回值

一个 Promise,它会以 undefined 的值 fulfilled。

尝试将 sink ID 设置为其现有值(即 AudioContext.sinkId 返回的值)不会引发错误,但会立即中止该过程。

异常

InvalidAccessError DOMException

尝试访问选定的音频输出设备失败时抛出。

NotAllowedError DOMException

当浏览器没有访问音频设备的权限时抛出。

NotFoundError DOMException

当传入的 sinkId 与系统上找到的任何音频设备都不匹配时抛出。

示例

在我们的 SetSinkId 测试示例(查看 源代码)中,我们创建了一个音频图,通过 AudioBufferSourceNode 生成三秒钟的白噪声,并将其通过 GainNode 进行处理,使其声音稍小一些。

js
mediaDeviceBtn.addEventListener("click", async () => {
  if ("setSinkId" in AudioContext.prototype) {
    selectDiv.textContent = "";

    const stream = await navigator.mediaDevices.getUserMedia({
      audio: true,
    });
    const devices = await navigator.mediaDevices.enumerateDevices();

    // Most of the DOM scripting to generate the dropdown cut out for brevity

    const audioOutputs = devices.filter(
      (device) =>
        device.kind === "audiooutput" && device.deviceId !== "default",
    );

    audioOutputs.forEach((device) => {
      const option = document.createElement("option");
      option.value = device.deviceId;
      option.textContent = device.label;
      select.appendChild(option);
    });

    const option = document.createElement("option");
    option.value = "none";
    option.textContent = "None";
    select.appendChild(option);

    select.addEventListener("change", async () => {
      if (select.value === "none") {
        await audioCtx.setSinkId({ type: "none" });
      } else {
        await audioCtx.setSinkId(select.value);
      }
    });
  }
});

我们还为用户提供了一个下拉菜单,允许他们动态更改音频输出设备。为此,我们:

  1. 提供一个按钮来填充下拉菜单。我们首先调用 MediaDevices.getUserMedia() 来触发我们需要允许设备枚举的权限提示,然后使用 MediaDevices.enumerateDevices() 获取所有可用设备。我们遍历不同的设备,并将每个设备作为选项添加到 <select> 元素中。我们还创建了一个“无”选项,用于您不想在任何输出设备上播放音频的情况。
  2. <select> 元素添加一个 change 事件监听器,以便在选择新值时更改 sink ID,从而更改音频输出设备。如果下拉菜单中选择了“无”,我们则使用 { type : 'none' } 对象参数调用 setSinkId() 来选择不使用任何音频设备;否则,我们将其与 <select> 元素 value 属性中包含的音频设备 ID 作为参数一起调用。

输出设备可以在音频播放期间、之前或之间更改。

规范

规范
Web Audio API
# dom-audiocontext-setsinkid

浏览器兼容性

另见