AudioContext:setSinkId() 方法
AudioContext 接口的 setSinkId() 方法用于设置 AudioContext 的输出音频设备。如果未显式设置 sink ID,则会使用系统默认音频输出设备。
要将音频设备设置为与默认设备不同的设备,开发者需要获得访问音频设备的权限。如果需要,可以通过调用 MediaDevices.getUserMedia() 来提示用户授予所需权限。
此外,此功能可能会被 speaker-selection Permissions Policy 阻止。
语法
setSinkId(sinkId)
参数
sinkId-
要设置为输出音频设备的设备的 sink ID。这可以接受以下任一类型的值:
- String
-
一个代表 sink ID 的字符串,例如通过
MediaDevices.enumerateDevices()返回的MediaDeviceInfo对象的deviceId属性检索到。 AudioSinkOptions-
一个表示 sink ID 不同选项的对象。目前它只有一个属性
type,值为none。设置此参数将使音频被处理而不通过任何音频输出设备播放。当您不需要与处理同步播放时,这是一个减少功耗的有用选项。
返回值
一个 Promise,它会以 undefined 的值 fulfilled。
尝试将 sink ID 设置为其现有值(即 AudioContext.sinkId 返回的值)不会引发错误,但会立即中止该过程。
异常
InvalidAccessErrorDOMException-
尝试访问选定的音频输出设备失败时抛出。
NotAllowedErrorDOMException-
当浏览器没有访问音频设备的权限时抛出。
NotFoundErrorDOMException-
当传入的
sinkId与系统上找到的任何音频设备都不匹配时抛出。
示例
在我们的 SetSinkId 测试示例(查看 源代码)中,我们创建了一个音频图,通过 AudioBufferSourceNode 生成三秒钟的白噪声,并将其通过 GainNode 进行处理,使其声音稍小一些。
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);
}
});
}
});
我们还为用户提供了一个下拉菜单,允许他们动态更改音频输出设备。为此,我们:
- 提供一个按钮来填充下拉菜单。我们首先调用
MediaDevices.getUserMedia()来触发我们需要允许设备枚举的权限提示,然后使用MediaDevices.enumerateDevices()获取所有可用设备。我们遍历不同的设备,并将每个设备作为选项添加到<select>元素中。我们还创建了一个“无”选项,用于您不想在任何输出设备上播放音频的情况。 - 为
<select>元素添加一个change事件监听器,以便在选择新值时更改 sink ID,从而更改音频输出设备。如果下拉菜单中选择了“无”,我们则使用{ type : 'none' }对象参数调用setSinkId()来选择不使用任何音频设备;否则,我们将其与<select>元素value属性中包含的音频设备 ID 作为参数一起调用。
输出设备可以在音频播放期间、之前或之间更改。
规范
| 规范 |
|---|
| Web Audio API # dom-audiocontext-setsinkid |
浏览器兼容性
加载中…