javascript webrtc:介质设备,枚举设备()返回空设备ID

fquxozlt  于 2023-02-02  发布在  Java
关注(0)|答案(1)|浏览(200)

我目前正在探索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,}),但仍然得到相同的结果。

lskq00tm

lskq00tm1#

它现在在getUserMedia之前返回空的deviceId s,因为跟踪库(和still are)正在集体调用enumerateDevices来对人们进行指纹识别,而从来没有打算要求摄像头或麦克风。
Privacy Interest Group (PING)对该规范进行了审查,因此,为了改善用户隐私,这个 enumerate first 策略(在询问用户摄像头或麦克风之前先枚举设备)被弃用。* 即使在选择用户进入持久权限的浏览器中也是如此。*(警告:这最后一部分在Chrome中被取消了,所以请转到★ crbug 1101860!)
所有的大型WebRTC网站都已经使用了“设备优先”策略(首先要求摄像头或麦克风,然后在直播时在“选项”下实现设备切换️),因此这一突破性的变化被认为是可以接受的。
换句话说,在getUserMedia解析之前,你只能知道用户是否没有摄像头或麦克风,这是剩下的两个指纹位(你不会看到列出多个设备)。
我之前也尝试过调用[getUserMedia],...但仍然得到相同的结果。
然后你做错了什么,因为labeldeviceId都可用,使设备切换仍然工作。请参阅WebRTC Samples的演示。你甚至仍然可以存储那些deviceId,并在未来访问时与getUserMedia一起使用。这部分仍然有效,只是在使用deviceId约束请求它们之前,不能枚举它们(跟踪它们的存在)。
操作假设是,最流行的跟踪库在阴影中操作,并且不会冒险代表其客户端站点实际提示用户使用其相机或麦克风。

相关问题