我正在将一个铬扩展转换成显式v3,并遇到了一个可能与此无关的问题。我正在使用navigator.mediaDevices.enumerateDevices来获取连接麦克风的列表。当打开新的选项卡时,我发现保存的麦克风没有被选中,并且经过一些调试后,我发现deviceID在从不同的选项卡重新加载时是不同的。得到列表的代码是非常直接的;
function getBrowserMics() {
//This is just building the mic list
var stream;
navigator.mediaDevices
.getUserMedia({ audio: true })
.then(s => (stream = s), e => console.log(e.message))
.then(() => navigator.mediaDevices.enumerateDevices())
.then(devices => {
$.each(devices, function(index, dv) {
if (dv.kind == "audioinput") {
if (
typeof storedBrowserMicList[dv.deviceId] == "undefined"
) {
browserMicList.push(dv);
// console.log(`browserMicList array ${browserMicList}`);
storedBrowserMicList[dv.deviceId] = dv;
console.log(`Stored Browser Mic list object is: ${JSON.stringify(dv)}`);
}
}
});
})
.catch(e => console.log(e));
}为了进行测试,我使用了一个连接到计算机的设备。如果我在一个选项卡上运行这个选项卡,我会得到以下信息:
content.js:118 Stored Browser Mic list object is: {"deviceId":"436f6e823d2ce9846735e8091cb20fe3bb3fbdb28c33c353d657b34fafbb383d","kind":"audioinput","label":"Microphone 1 (0555:1002)","groupId":"23d7627f4f062c3d9f28596532e5e467e4662f3b142ff583909dab5a8f3d413f"}如果我刷新选项卡,这将保持不变。如果我去另一个标签,我得到以下信息;
Stored Browser Mic list object is: {"deviceId":"6c07bd2b34257d25afd5bc59613e470a019994273d5bfa4546318ade36336fe9","kind":"audioinput","label":"Microphone 1 (0555:1002)","groupId":"e617ed598de785b4d655ed017586dc954cdc8e1abbbecdd78288a1109848ddba"}我想这可能是一个域问题,但我尝试使用相同的域作为另一个选项卡,但它是不同的。在测试时,我发现有时我会在另一个选项卡中得到一个与该设备一起使用的deviceID。这似乎不一致。有一件事是不同的,那就是我也通过webHID API连接到这个设备。在通过webHID连接设备之后,我做了一些测试,但这似乎不影响设备ID,无论它是否连接。我的主要测试机器是运行铬99.0.4844.74的macOS。
我找到了一个去年的帖子,来自一个有同样问题的人,但没有添加任何解决方案;为什么navigator.mediaDevices.enumerateDevices()返回不同的值?。
对于为什么会发生这种情况,以及我如何防止设备is在选项卡之间发生更改,有人有什么建议吗?
发布于 2022-04-04 20:57:14
也许是因为规范中描述的这种行为?
但是,只要没有本地设备从该原点附加到页面中的活动MediaStreamTrack,并且没有将访问本地设备的存储权限授予该原点,那么用户代理可以在关闭该原点的最后一次浏览会话后清除该标识符。如果用户代理选择在此条件下不清除标识符,则必须提供用户明显检查和删除标识符的功能,就像cookie一样。
https://www.w3.org/TR/mediacapture-streams/#dom-mediadeviceinfo-deviceid
在启用设备标识和减轻指印之间,这是一个棘手的平衡。页面可能枚举它不打算仅用于访问这些唯一设备it的设备。浏览器为每个源保留单独的ID,并为不需要设备访问的源创建新的ID,从而保护用户的隐私。
https://stackoverflow.com/questions/71532591
复制相似问题