AudioContext:setSinkId() 方法

实验性: 这是实验性技术
在生产环境中使用此功能之前,请仔细查看浏览器兼容性表

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,部分或所有支持的浏览器都支持此功能。

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

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

此外,此功能可能被speaker-selection 权限策略阻止。

语法

js
setSinkId(sinkId)

参数

sinkId

要设置为输出音频设备的设备的 sink ID。它可以采用以下值类型之一

字符串

表示 sink ID 的字符串,例如,可以通过 MediaDeviceInfo 对象的 deviceId 属性获取,该对象由 MediaDevices.enumerateDevices() 返回。

AudioSinkOptions

表示 sink ID 不同选项的对象。目前,它只包含一个属性 type,其值为 none。设置此参数会导致音频在处理时不会通过任何音频输出设备播放。当你不需要播放音频,只进行处理时,这是一个有助于降低功耗的选项。

返回值

一个Promise,该 Promise 将以 undefined 的值完成。

尝试将 sink ID 设置为其现有值(即由 AudioContext.sinkId 返回的值),不会抛出任何错误,但会立即中止进程。

异常

InvalidAccessError DOMException

如果访问选定的音频输出设备失败,则抛出此异常。

NotAllowedError DOMException

如果浏览器没有权限访问音频设备,则抛出此异常。

NotFoundError DOMException

如果传递的 sinkId 与系统中找到的任何音频设备都不匹配,则抛出此异常。

示例

在我们的SetSinkId 测试示例(查看源代码)中,我们创建了一个音频图,通过AudioBufferSourceNode 生成三秒钟的白噪声,我们还通过GainNode 运行它,以降低音量。

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

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

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

规范

规范
Web 音频 API
# dom-audiocontext-setsinkid

浏览器兼容性

BCD 表仅在启用 JavaScript 的浏览器中加载。

另请参阅