我目前正在探索webRTC,我想做的是使用navigator.mediaDevices.enumerateDevices();
获取所有的媒体设备信息沿着deviceId
,然后根据其种类属性将其分离出来,并允许用户选择哪个媒体设备用于特定种类。比如显示找到的相机的下拉列表,并允许用户选择使用哪个相机,这就是为什么我需要每个设备的deviceId。
这是我目前用来获取媒体设备的代码:
const getConnectedDevices = async (type, callback) => {
const mediaDevices = await navigator.mediaDevices.enumerateDevices();
console.log(mediaDevices);
callback(mediaDevices.filter((device) => device.kind === type));
};
这是我得到的输出:
[
{
deviceId: ""
groupId: "51081772b5c5df2dbcb2ca2b8ae36c5d693d816f8d4bf4039cdb15802b7ffc54"
kind: "audioinput"
label: ""
},
{
deviceId: ""
groupId: "2e7a46f912e66fea3b6af4822e427c02a7725c39d86194dccdf5b7993293d7da"
kind: "videoinput"
label: ""
},
{
deviceId: ""
groupId: "51081772b5c5df2dbcb2ca2b8ae36c5d693d816f8d4bf4039cdb15802b7ffc54"
kind: "audiooutput"
label: ""
}
]
一直得到一个空的deviceId。我也试着在await navigator.mediaDevices.enumerateDevices()
之前调用await navigator.mediaDevices.getUserMedia( {video: true,audio: true,})
,但仍然得到相同的结果。
1条答案
按热度按时间lskq00tm1#
它现在在
getUserMedia
之前返回空的deviceId
s,因为跟踪库(和still are)正在集体调用enumerateDevices
来对人们进行指纹识别,而从来没有打算要求摄像头或麦克风。Privacy Interest Group (PING)对该规范进行了审查,因此,为了改善用户隐私,这个 enumerate first 策略(在询问用户摄像头或麦克风之前先枚举设备)被弃用。* 即使在选择用户进入持久权限的浏览器中也是如此。*(警告:这最后一部分在Chrome中被取消了,所以请转到★ crbug 1101860!)
所有的大型WebRTC网站都已经使用了“设备优先”策略(首先要求摄像头或麦克风,然后在直播时在“选项”下实现设备切换️),因此这一突破性的变化被认为是可以接受的。
换句话说,在
getUserMedia
解析之前,你只能知道用户是否没有摄像头或麦克风,这是剩下的两个指纹位(你不会看到列出多个设备)。我之前也尝试过调用[getUserMedia],...但仍然得到相同的结果。
然后你做错了什么,因为
label
和deviceId
都可用,使设备切换仍然工作。请参阅WebRTC Samples的演示。你甚至仍然可以存储那些deviceId
,并在未来访问时与getUserMedia
一起使用。这部分仍然有效,只是在使用deviceId
约束请求它们之前,不能枚举它们(跟踪它们的存在)。操作假设是,最流行的跟踪库在阴影中操作,并且不会冒险代表其客户端站点实际提示用户使用其相机或麦克风。