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