WebRTC: Firefox无法检测到任何输出设备。

3

我尝试在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,才能获得弹出窗口提示允许共享我的设备。为什么需要这样做呢?

2个回答

7

枚举选择输出设备(扬声器)在Firefox中尚未实现。

更新:从Firefox 63开始,该功能位于“偏好设置”中。如果您在about:config中打开media.setsinkid.enabled,则输出设备将包含在类似Chrome的enumerateDevices中(需要麦克风权限)。

但是,要求麦克风权限来访问扬声器从来没有太多意义。这是一种权限升级,实际上使该功能在web会议之外无用。

现有API还存在指纹识别(跟踪)问题,因为它在Chrome中仅使用麦克风一次后就向站点公开用户系统的持续信息。

火狐浏览器和Safari从未添加setSinkId,出于这些原因。最新版本的规范添加了selectAudioOutput,解决了这些问题,并且很可能会被实现
顺便说一下,我需要手动添加我的页面域名...
在Firefox中共享摄像头和麦克风没有域白名单要求。从来没有过。一旦输出设备得到实现,也不会有这样的要求。
您提到的域名白名单仅适用于屏幕共享,即共享桌面。即使是这个要求在Firefox 52中也已经被取消,替换为警告
屏幕共享设备不会使用enumerateDevices枚举,因此可能不是您想要的,但我还是会解释原因:
那个白名单(现在是警告)的原因是网络上共享浏览器窗口存在的安全风险。简而言之,这种共享允许一个网站查看从其他域名召唤的网站的像素,绕过跨源保护。恶意站点可以利用此功能弹出您在其他已登录站点中的私人信息,有效地以您的身份进行浏览并捕获结果,窃取您的私人数据。
您可以在我的博客中了解更多信息。

FF 59.0.2(64位)输出设备尚未实现 - Alexey Muravyov
1
FF 76.0.1 (64-bit) 输出设备尚未实现 - Alexey Muravyov
@AlexeyMuravyov 现在已经实现了吗? 在MDN上写着:“在Firefox 63之前,enumerateDevices() 仅返回输入设备。从Firefox 63开始,如果启用media.setsinkid.enabled首选项,则还包括输出设备。” - Thisara
@jib 有没有办法通过 JavaScript(使用 Web 应用程序)访问该首选项并启用它? - Thisara
@Thisara,如果不是在首选项后面,那就不会有这个问题了。Firefox和Safari由于对现有API的指纹识别担忧,从未添加过此功能。规范的最新版本增加了selectAudioOutput,解决了这些问题,并且很可能会被实现。 - jib
显示剩余2条评论

1
只是以防万一,如果这对某人仍然有用的话,我只需添加这行代码就修复了它。
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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接