MediaDevices: enumerateDevices() 方法

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

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

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

语法

js
enumerateDevices()

参数

无。

返回值

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

除了默认设备之外,只有已获得权限的设备才“可用”。

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

如果枚举失败,则 promise 将被拒绝。

安全要求

对 API 的访问受以下约束

  • 必须在安全上下文中调用该方法。
  • 文档必须完全处于活动状态,并且其可见性必须为“可见”。

示例

以下是用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

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参阅