Javascript getUserMedia-如何检测设备是否实际有摄像头

Javascript getUserMedia-如何检测设备是否实际有摄像头,javascript,camera,getusermedia,modernizr,mediadevices,Javascript,Camera,Getusermedia,Modernizr,Mediadevices,我正在使用html5/javascript getUserMedia api编写一个js应用程序,如果可用,它将使用设备的摄像头。我正在使用Modernizer检测(浏览器的)功能,如下所示: if (Modernizr.getusermedia) { 在真块中: navigator.getUserMedia( { // we would like to use video but not audio // This object is browser API sp

我正在使用html5/javascript getUserMedia api编写一个js应用程序,如果可用,它将使用设备的摄像头。我正在使用Modernizer检测(浏览器的)功能,如下所示:

if (Modernizr.getusermedia) {
在真块中:

navigator.getUserMedia(
    {   // we would like to use video but not audio
        // This object is browser API specific! - some implementations require boolean properties, others require strings!
        video: true, 
        audio: false
    },
    function(videoStream) {
        // 'success' callback - user has given permission to use the camera
        // my code to use the camera here ... 
    },
    function() {
        // 'no permission' call back
        console.log("user did not give access to the camera");
    }               
);
这个很好用。但我发现Modernizer.getUserMedia调用返回true的依据是支持api的浏览器,而不是设备是否真的有摄像头

例如,在我的带有iSight摄像头和当前Chrome版本的MacBook上,Modernizr.getUserMedia返回true,然后navigator.getUserMedia(…)提示获得使用摄像头的权限。极好的

但是,在另一台没有摄像头但使用当前版本的Chrome的机器上,Modernizr.getUserMedia返回true,这意味着navigator.getUserMedia(…)会提示用户允许使用设备没有的摄像头。不太好

有人知道是否有可能检测到摄像机的存在吗?理想情况下,如果用户没有摄像头,我不想提示用户访问摄像头的权限

干杯


Nathan

getUserMedia API还没有出版,还存在一些bug和需要改进的地方,比如这个问题


但目前我看不出有什么方法可以让你检查电脑是否真的有摄像头。尽管您可以使用Flash:-(我认为…

您可以使用MediaStreamTrack.getSources。这将返回连接到PC的视频和音频设备的列表。这不需要用户权限

然后,您可以将ID传递给getUserMedia以获取所需的媒体设备。

这对我有帮助:

function(videoStream) {
    // 'success' callback - user has given permission to use the camera
    if (videoStream.getVideoTracks().length > 0) {
        // my code to use the camera here ... 
    }
}

您可以使用Muaz Khan webrtc实验中的DetectRTC:

使用:


获取de设备。

导航器。mediaDevicesAPI在过去五年左右已经稳定下来

现在可以从浏览器javascript执行此操作

{
  navigator.mediaDevices.enumerateDevices()
  .then ( function (devices) {
      console.log(devices)
      const videoDevices = devices.filter(device => device.kind === 'videoinput')
      console.log(videoDevices)
  })
}
如果您的机器有任何视频设备,则在过滤
设备
阵列后,您将在
视频设备
阵列中返回一些内容


但是,除非你的程序已经调用了
getUserMedia()
并获得了许可,否则你(至少在谷歌Chrome上)无法知道你有多少个摄像头,或者它们的
标签(名称)是什么。因为网络爬行。

调用了哪个回调(使用哪些参数)当您允许它在没有摄像头的设备上运行时?会调用成功回调,但我还没有检查arg(上面代码中的视频流)是否为空。这是一个好问题,我应该检查一下。我将很快进行检查,并让您知道…MediaStreamTrack.getSources已被删除,不再受支持。
{
  navigator.mediaDevices.enumerateDevices()
  .then ( function (devices) {
      console.log(devices)
      const videoDevices = devices.filter(device => device.kind === 'videoinput')
      console.log(videoDevices)
  })
}