我尝试在 Ubuntu 16.04 上的 Mozilla Firefox v50.1.0 中运行此脚本来检测音频设备。 [1]
navigator.mediaDevices.enumerateDevices()
.then(function(devices) {
devices.forEach(function(device) {
console.log(device.kind + ": " + device.label +
" id = " + device.deviceId);
});
})
.catch(function(err) {
console.log(err.name + ": " + err.message);
});
它仅检测输入设备,但不检测输出。适用于 Chrome 和 Opera,但不适用于 Firefox。
顺便说一句,我需要手动将页面的域添加到 Firefox 的 about:config 中的 media.getusermedia.screensharing.allowed_domains 中,以弹出窗口提示允许共享我的设备。为什么这是必要的?
更新:从 Firefox 63 开始,该功能位于首选项后面。如果您在 about:config 中打开
media.setsinkid.enabled
,则输出设备将包含在 enumerateDevices 中,类似于 Chrome 的做法(需要麦克风权限)。
但是,要求麦克风权限才能访问扬声器从来没有多大意义。这是一种权限升级,有效地使该功能在网络会议之外毫无用处。
现有 API 还存在指纹识别(跟踪)问题,因为在 Chrome 中仅使用一次麦克风后,它就会向网站公开有关用户系统的持续信息。
由于这些原因,Firefox 和 Safari 从未添加过
setSinkId
。最新版本的规范添加了 selectAudioOutput 来解决这些问题,并且很可能会实现。
顺便说一句,我需要手动添加我的页面的域名...
在 Firefox 中共享摄像头和麦克风没有域白名单要求。从来不是。一旦实现,也不会有输出设备。
您提到的域白名单仅用于屏幕共享,即桌面共享。即使这一要求在 Firefox 52 中也已被删除,并被警告所取代。
屏幕共享设备未用enumerateDevices
枚举,所以可能不是您想要的,但无论如何我都会说明原因:白名单(现在是警告)的原因是在网络上共享浏览器窗口所固有的安全风险。简而言之,这种共享允许站点查看它从其他域调用的站点的像素,从而绕过跨源保护。恶意网站可能会利用它从您登录的其他网站弹出您的私人信息,有效地像您一样浏览并捕获结果,从而窃取您的私人数据。
您可以在
我的博客中阅读更多相关信息。
await navigator.mediaDevices.getUserMedia({audio: true, video: false})
const mediaDevices: MediaDeviceInfo[] = await navMediaDevices.enumerateDevices()
.就像这样:
await navigator.mediaDevices.getUserMedia({audio: true, video: false});
const mediaDevices: MediaDeviceInfo[] = await navMediaDevices.enumerateDevices();
console.log("mediaDevices:", mediaDevices)