MediaDevices: enumerateDevices() 方法
enumerateDevices() 方法属于 MediaDevices 接口,用于请求当前可用的媒体输入和输出设备列表,例如麦克风、摄像头、耳机等。返回的 Promise 会解析为一个 MediaDeviceInfo 对象数组,每个对象描述一个设备。
返回的列表将省略任何被文档 权限策略 阻止的设备:microphone、camera、speaker-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 |
浏览器兼容性
加载中…
另见
MediaDevices.getUserMedia- WebRTC - 该 API 的介绍页面
- 媒体捕获和流 API - 用于媒体流对象的 API
- 拍摄网络摄像头照片 - 关于使用
getUserMedia()拍摄照片而非视频的教程。