音频输出设备 API

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

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

音频输出设备 API允许 Web 应用程序提示用户应使用哪个输出设备进行音频播放。

概念和用法

操作系统通常允许用户指定音频应通过扬声器、蓝牙耳机或其他音频输出设备播放。此 API 允许应用程序在网页中提供相同的功能。

即使权限策略允许,访问特定音频输出设备仍然需要用户的明确许可,因为用户可能位于播放音频通过某些输出设备不合适的位置。

该 API 提供了MediaDevices.selectAudioOutput()方法,允许用户从文档的speaker-selection指令(Permissions-Policy HTTP 标头)允许的输出设备中选择所需的音频输出。然后,所选设备将获得用户许可,允许其使用MediaDevices.enumerateDevices()枚举,并使用HTMLMediaElement.setSinkId()将其设置为音频输出设备。

音频设备可能会任意连接和断开连接。希望对这种更改做出反应的应用程序可以监听devicechange事件,并使用enumerateDevices()确定返回的设备中是否存在sinkId。这可能会触发暂停或恢复播放等操作。

接口

对其他接口的扩展

音频输出设备 API 扩展了以下 API,并添加了列出的功能

MediaDevices

MediaDevices.selectAudioOutput()

此方法提示用户选择特定的音频输出设备,例如扬声器或耳机。选择设备会授予用户使用该设备的权限,并返回有关该设备的信息,包括其 ID。

HTMLMediaElement

HTMLMediaElement.setSinkId()

此方法设置要用于输出的音频设备的 ID,如果允许,将使用该 ID。

HTMLMediaElement.sinkId

此属性返回正在用于输出的音频设备的唯一 ID,如果正在使用默认的用户代理设备,则返回空字符串。

安全要求

对 API 的访问受以下约束

示例

以下是在由按钮点击触发的函数中使用selectAudioOutput()并将其选定的设备设置为音频输出的示例。

代码首先检查是否支持selectAudioOutput(),如果支持,则使用它来选择输出并返回设备 ID。然后,我们使用默认输出播放一些音频,然后调用setSinkId()以切换到选定的输出设备。

js
document.querySelector("#myButton").addEventListener("click", async () => {
  if (!navigator.mediaDevices.selectAudioOutput) {
    console.log("selectAudioOutput() not supported or not in secure context.");
    return;
  }

  // Display prompt to select device
  const audioDevice = await navigator.mediaDevices.selectAudioOutput();

  // Create an audio element and start playing audio on the default device
  const audio = document.createElement("audio");
  audio.src = "https://example.com/audio.mp3";
  audio.play();

  // Change the sink to the selected audio output device.
  audio.setSinkId(audioDevice.deviceId);
});

请注意,如果记录输出详细信息,它们可能如下所示

js
console.log(
  `${audioDevice.kind}: ${audioDevice.label} id = ${audioDevice.deviceId}`,
);
// audiooutput: Realtek Digital Output (Realtek(R) Audio) id = 0wE6fURSZ20H0N2NbxqgowQJLWbwo+5ablCVVJwRM3k=

规范

规范
音频输出设备 API

浏览器兼容性

api.MediaDevices.selectAudioOutput

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

api.HTMLMediaElement.setSinkId

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

api.HTMLMediaElement.sinkId

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

http.headers.Permissions-Policy.speaker-selection

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