Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript getUserMedia之后枚举设备:如何查找活动设备?_Javascript_Getusermedia_Mediastream_Enumerate Devices - Fatal编程技术网

Javascript getUserMedia之后枚举设备:如何查找活动设备?

Javascript getUserMedia之后枚举设备:如何查找活动设备?,javascript,getusermedia,mediastream,enumerate-devices,Javascript,Getusermedia,Mediastream,Enumerate Devices,给定MediaStream实例,是否有方法检测哪个设备(摄像头、麦克风)处于活动状态 我目前正在使用的应用程序只需查询此类流并将其附加到元素: const stream=wait navigator.mediaDevices.getUserMedia({audio:true,video:true}) const el=document.querySelector(“视频”) el.src对象=流 console.log(stream.getTracks()) //MediaStreamTrack

给定
MediaStream
实例,是否有方法检测哪个设备(摄像头、麦克风)处于活动状态

我目前正在使用的应用程序只需查询此类流并将其附加到
元素:

const stream=wait navigator.mediaDevices.getUserMedia({audio:true,video:true})
const el=document.querySelector(“视频”)
el.src对象=流
console.log(stream.getTracks())
//MediaStreamTrack{kind:“audio”,id:{000d071e-f936-42d8-872e-a568cd96cc2d},标签:“USB音频设备Mono”,…}
​// MediaStreamTrack{kind:“video”,id:{186427d5-b04a-4906-9177-1a088c5d4e0a},标签:“C922 Pro Stream网络摄像头”…
下一步是让用户能够更改摄像头/麦克风。基本代码如下:

const devices=wait navigator.mediaDevices.enumerateDevices()
console.log(设备)
//MediaDeviceInfo{deviceId:“yQx5+MN7znbmkE0tV98jJHpvqrUaa6Gv5WIXF52jj0s=”,种类:“视频输入”,标签:“C922专业流式网络摄像头”,…}
​// MediaDeviceInfo{deviceId:“dijwtaogqbjt2hoqfj4xjzjxbbwbxz4ceex3a2fn0zga=”,种类:“音频输入”,标签:“USB音频设备单声道”,…}​
//MediaDeviceInfo{deviceId:“/t3u7BlfExATtBC4CUmyqIo8RORDxMu9aMrJJHN0Ez0=”,种类:“音频输入”,标签:“C922 Pro流式网络摄像头模拟立体声”…)​
//MediaDeviceInfo{deviceId:“/5pqK1599b+mKHm26zCYQ+Ql3vG0Em7xiVbqfm1C/9A=”,种类:“音频输入”,标签:“内置音频数字立体声显示器(IEC958)”,…}
//MediaDeviceInfo{deviceId:“Tib/PVSCFUFUQUATYYVGTXEXEU08OPGKE9MXEVMXQ84=”,种类:“音频输入”,标签:“USB音频设备模拟立体声监视器”,…}
我可以简单地将这个列表转换成
+
列表(每种
类型
),让用户决定并重新请求带有所选
设备ID的流(
getUserMedia({audio:{deviceId:selectedDeviceId}})

但是:磁道和设备ID不匹配,那么我如何确定应该预先选择哪个
?查看MDN,流的磁道ID是(这很有意义),但没有提供太多的替代方案

当然,答案不可能是“按标签走”——我可以插入第二个相同的网络摄像头,并拥有两个同名视频设备?

如果你这样做的话

const label = stream.getVideoTracks()[0].label
您将返回视频设备的名称。它是类的一个属性

至于默认选项,下面是我如何找出哪一个是默认选项的。(这很糟糕,但我没有找到更好的方法。)

执行
.getUserMedia({video:true,audio:true})
操作并查看
标签
属性。否则,doltish约束对象将选择默认设备,并顺便获得完成的用户权限授予

当我说默认设备时,我指的是在浏览器设置中设置的设备。

您可以在MediaStreamTracks上获取当前应用的设备,并从那里检查设备ID

const used_devices = mediastream.getTracks()
  .map( (track) => track.getSettings().deviceId );

你可能误读了这个问题,他们清楚地解释了“按标签”是一个坏主意。没有必要将其他答案的内容复制到你的答案中。标签不是唯一的。