webrtc: mediaDevices.enumerateDevices() returns 空 deviceId
webrtc: mediaDevices.enumerateDevices() returns empty deviceId
我目前正在探索 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,})
但仍然得到相同的结果。
它 returns 现在比 getUserMedia
空 deviceId
秒,因为跟踪库(和 still are)大量调用 enumerateDevices
来指纹识别,无意要相机或麦克风。
规范已由 Privacy Interest Group (PING), and, as a result, this enumerate first strategy (enumerating devices before asking the user for their camera or microphone) was deprecated, to improve user privacy. This is true even in browsers that opt users into persistent permission. (caveat: this last part got backed out in Chrome, so please go ★ crbug 1101860 审核!)
所有大型 WebRTC 站点都已经使用 设备优先 策略(首先请求摄像头或麦克风,然后在直播时在 ⚙️ 选项下实现设备切换)。因此,此重大更改的网络兼容性被认为是可以接受的。
也就是说,在getUserMedia
解析之前,只能知道用户是没有摄像头还是没有麦克风。这是仅存的两个指纹识别位(您不会看到列出多个设备)。
I also tried calling [getUserMedia] before, ... but still got same result.
那你做错了,因为 label
s 和 deviceId
s 都可用,使设备切换仍然有效。有关演示,请参阅 WebRTC Samples。您甚至还可以存储这些 deviceId
并在以后的访问中将它们与 getUserMedia
一起使用,这部分仍然有效。在使用 deviceId
约束请求它们之前,您无法枚举它们(跟踪它们的存在)。
操作假设是最流行的跟踪库在阴影中运行,并且不会冒着实际提示用户代表其客户站点使用相机或麦克风的风险。
我目前正在探索 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,})
但仍然得到相同的结果。
它 returns 现在比 getUserMedia
空 deviceId
秒,因为跟踪库(和 still are)大量调用 enumerateDevices
来指纹识别,无意要相机或麦克风。
规范已由 Privacy Interest Group (PING), and, as a result, this enumerate first strategy (enumerating devices before asking the user for their camera or microphone) was deprecated, to improve user privacy. This is true even in browsers that opt users into persistent permission. (caveat: this last part got backed out in Chrome, so please go ★ crbug 1101860 审核!)
所有大型 WebRTC 站点都已经使用 设备优先 策略(首先请求摄像头或麦克风,然后在直播时在 ⚙️ 选项下实现设备切换)。因此,此重大更改的网络兼容性被认为是可以接受的。
也就是说,在getUserMedia
解析之前,只能知道用户是没有摄像头还是没有麦克风。这是仅存的两个指纹识别位(您不会看到列出多个设备)。
I also tried calling [getUserMedia] before, ... but still got same result.
那你做错了,因为 label
s 和 deviceId
s 都可用,使设备切换仍然有效。有关演示,请参阅 WebRTC Samples。您甚至还可以存储这些 deviceId
并在以后的访问中将它们与 getUserMedia
一起使用,这部分仍然有效。在使用 deviceId
约束请求它们之前,您无法枚举它们(跟踪它们的存在)。
操作假设是最流行的跟踪库在阴影中运行,并且不会冒着实际提示用户代表其客户站点使用相机或麦克风的风险。