AudioContext:setSinkId() 方法
AudioContext
接口的 setSinkId()
方法用于设置 AudioContext
的输出音频设备。如果未显式设置音频输出设备,则将使用系统默认的音频输出设备。
要将音频设备设置为与默认音频设备不同的设备,开发者需要访问音频设备的权限。如果需要,可以通过 MediaDevices.getUserMedia()
调用提示用户授予所需的权限。
此外,此功能可能被speaker-selection
权限策略阻止。
语法
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
运行它,以降低音量。
我们还为用户提供了下拉菜单,允许他们动态更改音频输出设备。为此,我们执行以下操作:
- 提供一个按钮来填充下拉菜单。我们首先调用
MediaDevices.getUserMedia()
来触发我们需要允许枚举设备的权限提示,然后使用MediaDevices.enumerateDevices()
获取所有可用的设备。我们循环遍历不同的设备,并将每个设备作为<select>
元素中的选项提供。我们还为不希望将音频播放到任何输出设备的情况下创建一个“无”选项。jsmediaDeviceBtn.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>
元素添加一个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 的浏览器中加载。