音频输出设备 API
音频输出设备 API 允许 Web 应用程序提示用户应该使用哪个输出设备进行音频播放。
概念与用法
操作系统通常允许用户指定音频应该从扬声器、蓝牙耳机或其他音频输出设备播放。此 API 允许应用程序从网页内部提供相同的功能。
即使通过权限策略允许,访问特定的音频输出设备仍需要用户明确的许可,因为用户可能处于不适合通过某些输出设备播放音频的位置。
该 API 提供了 MediaDevices.selectAudioOutput() 方法,该方法允许用户从文档的 Permissions-Policy HTTP 标头中 speaker-selection 指令允许的设备中选择所需的音频输出。然后,选定的设备将获得用户许可,可以使用 MediaDevices.enumerateDevices() 进行枚举,并使用 HTMLMediaElement.setSinkId() 设置为音频输出设备。
音频设备可能会任意连接和断开。希望对这种类型更改做出响应的应用程序可以监听 devicechange 事件,并使用 enumerateDevices() 来确定返回的设备中是否存在 sinkId。这可能会触发,例如,暂停或恢复播放。
接口
其他接口的扩展
音频输出设备 API 扩展了以下 API,并添加了列出的功能
MediaDevices
- MediaDevices.selectAudioOutput()
- 
此方法提示用户选择一个特定的音频输出设备,例如扬声器或耳机。选择设备将授予用户使用该设备的许可,并返回有关设备的信息,包括其 ID。 
HTMLMediaElement
- HTMLMediaElement.setSinkId()
- 
此方法设置要用于输出的音频设备的 ID,如果允许,将使用该 ID。 
- HTMLMediaElement.sinkId
- 
此属性返回正在用于输出的音频设备的唯一 ID,如果正在使用默认用户代理设备,则返回空字符串。 
安全要求
API 的访问受以下约束:
- 
所有方法和属性只能在 安全上下文 中调用。 
- 
MediaDevices.selectAudioOutput()授予用户许可使用选定的设备作为音频输出接收器- 访问可能受 speaker-selectionHTTP 权限策略的限制。
- 需要 瞬时用户激活。必须由用户与页面或 UI 元素进行交互才能调用该方法。
 
- 访问可能受 
- 
HTMLMediaElement.setSinkId()设置一个允许的 ID 作为音频输出- 访问可能受 speaker-selectionHTTP 权限策略的限制。
- 设置非默认设备 ID 需要用户许可。- 这可以来自 MediaDevices.selectAudioOutput()启动的提示中的选择
- 如果用户已使用 MediaDevices.getUserMedia()授予了使用同一组中的媒体输入设备的权限,则也隐式授予了设置输出设备的用户许可。
 
- 这可以来自 
 
- 访问可能受 
示例
这是一个使用 selectAudioOutput() 的示例,该示例在由按钮点击触发的函数内调用,然后将选定的设备设置为音频输出。
代码首先检查 selectAudioOutput() 是否受支持,如果受支持,则使用它选择输出并返回 设备 ID。然后,我们使用默认输出播放一些音频,然后调用 setSinkId() 以切换到选定的输出设备。
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);
});
请注意,如果您记录输出详细信息,它们可能看起来像这样
console.log(
  `${audioDevice.kind}: ${audioDevice.label} id = ${audioDevice.deviceId}`,
);
// audiooutput: Realtek Digital Output (Realtek(R) Audio) id = 0wE6fURSZ20H0N2NbxqgowQJLWbwo+5ablCVVJwRM3k=
规范
| 规范 | 
|---|
| 音频输出设备 API | 
浏览器兼容性
api.MediaDevices.selectAudioOutput
加载中…
api.HTMLMediaElement.setSinkId
加载中…
api.HTMLMediaElement.sinkId
加载中…
http.headers.Permissions-Policy.speaker-selection
加载中…