Javascript webrtc:mediaDevices.enumerateDevices()返回空设备ID

Javascript webrtc:mediaDevices.enumerateDevices()返回空设备ID,javascript,webrtc,Javascript,Webrtc,我目前正在探索webRTC,我想做的是使用navigator.mediadevices.enumerateDevices()获取所有mediadevices信息以及deviceId,然后根据其种类属性将其分开,并允许用户选择用于特定种类的媒体设备。例如,显示找到的摄像头的下拉列表,并允许用户选择要使用的摄像头,这就是我需要每个设备的deviceId的原因 这是我当前用于获取mediadevices的代码: const getConnectedDevices = async (type, cal

我目前正在探索webRTC,我想做的是使用
navigator.mediadevices.enumerateDevices()获取所有mediadevices信息以及deviceId
,然后根据其种类属性将其分开,并允许用户选择用于特定种类的媒体设备。例如,显示找到的摄像头的下拉列表,并允许用户选择要使用的摄像头,这就是我需要每个设备的deviceId的原因

这是我当前用于获取mediadevices的代码:

 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: ""
    }
]
总是得到一个空的设备ID。
我还尝试在
wait navigator.mediaDevices.getUserMedia({video:true,audio:true,})之前调用
wait navigator.mediaDevices.enumerateDevices()
,但仍然得到相同的结果。

它返回空的
deviceId
现在比
getUserMedia
早,因为跟踪库是(和)集体呼叫
枚举设备
给人们按指纹,而不打算要相机或麦克风

规范已由审查,因此,此枚举优先策略(在向用户索要相机或麦克风之前枚举设备)已被弃用,以改善用户隐私。即使在选择用户进入持久权限的浏览器中也是如此。(注意:最后一个部分是铬合金的,所以请离开★ !)

所有大型WebRTC网站都已经采用了设备优先的策略(先要求摄像头或麦克风,然后在⚙️ 因此,这种突破性的改变被认为是可以接受的

换句话说,在
getUserMedia
解析之前,您只能了解用户是否没有摄像头或麦克风。这是剩下的唯一两个指纹位(您不会看到列出的多个设备)

我以前也尝试过调用[getUserMedia],但仍然得到了相同的结果

然后你做了一些错误的事情,因为
标签
s和
设备ID
s都可以使用,以使设备切换仍然有效。请参阅演示。你甚至可以存储这些
设备ID
s,并在以后的访问中与
getUserMedia
一起使用,这部分仍然有效。你无法枚举它们(跟踪他们的存在),然后使用
deviceId
约束请求他们


运行假设是,最流行的跟踪库在阴影中运行,并且不会冒任何实际提示用户代表其客户端站点使用其相机或麦克风的风险。

这是否回答了您的问题?否,我在发布此问题之前看到了该答案,并尝试拨打wait navigator.mediaedevices.getUserMedia({video:true,audio:true,})请求权限,但我仍然得到了类似的结果。我仍然让deviceId为空