MediaDevices: enumerateDevices() 方法

Baseline 2023
新推出

自 2023 年 8 月起,此功能已在最新的设备和浏览器版本中可用。此功能可能不适用于旧设备或浏览器。

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

enumerateDevices() 方法属于 MediaDevices 接口,用于请求当前可用的媒体输入和输出设备列表,例如麦克风、摄像头、耳机等。返回的 Promise 会解析为一个 MediaDeviceInfo 对象数组,每个对象描述一个设备。

返回的列表将省略任何被文档 权限策略 阻止的设备:microphonecameraspeaker-selection(用于输出设备)等。对特定非默认设备的访问也受 Permissions API 的控制,并且列表将省略用户未明确授予权限的设备。

语法

js
enumerateDevices()

参数

无。

返回值

一个 Promise,解析为一个 MediaDeviceInfo 对象数组。数组中的每个对象都描述了一个可用的媒体输入或输出设备。顺序很重要 — 默认的捕获设备将首先列出。

除了默认设备外,只有已授予权限的设备才是“可用”的。

如果媒体设备是输入设备,则会返回一个 InputDeviceInfo 对象。

如果枚举失败,则 Promise 会被拒绝。

安全要求

API 的访问受以下约束:

  • 必须在 安全上下文 中调用该方法。
  • 文档必须完全活动且其可见性必须是“visible”。

示例

以下是使用 enumerateDevices() 的示例。它会输出 设备 ID 列表,如果可用,还会显示设备名称。

js
if (!navigator.mediaDevices?.enumerateDevices) {
  console.log("enumerateDevices() not supported.");
} else {
  // List cameras and microphones.
  navigator.mediaDevices
    .enumerateDevices()
    .then((devices) => {
      devices.forEach((device) => {
        console.log(`${device.kind}: ${device.label} id = ${device.deviceId}`);
      });
    })
    .catch((err) => {
      console.error(`${err.name}: ${err.message}`);
    });
}

这可能会产生

videoinput: id = csO9c0YpAf274OuCPUA53CNE0YHlIr2yXCi+SqfBZZ8=
audioinput: id = RKxXByjnabbADGQNNZqLVLdmXlS0YkETYCIbg+XxnvM=
audioinput: id = r2/xw1xUPIyZunfV1lGrKOma5wTOvCkWfZ368XCndm0=

或者,如果一个或多个 MediaStream 处于活动状态或已授予持久权限

videoinput: FaceTime HD Camera (Built-in) id=csO9c0YpAf274OuCPUA53CNE0YHlIr2yXCi+SqfBZZ8=
audioinput: default (Built-in Microphone) id=RKxXByjnabbADGQNNZqLVLdmXlS0YkETYCIbg+XxnvM=
audioinput: Built-in Microphone id=r2/xw1xUPIyZunfV1lGrKOma5wTOvCkWfZ368XCndm0=

规范

规范
媒体捕获和流
# dom-mediadevices-enumeratedevices

浏览器兼容性

另见