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

时间:2012-10-14 19:48:37

标签: javascript camera modernizr

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

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调用基于支持api的浏览器返回true,而不是设备是否实际上有相机。

IE。在我的MacBook上使用iSight摄像头和当前版本的Chrome,Modernizr.getUserMedia返回true,然后navigator.getUserMedia(...)提示您使用摄像头。优异的

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

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

干杯

5 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

这对我有所帮助:

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

答案 2 :(得分:0)

getUserMedia API仍然非常新鲜,并且会有一些错误和需要改进的地方,比如这个问题。

但目前我没有办法检查计算机是否真的有摄像头。虽然你可以使用Flash :-(检测它,我认为......

答案 3 :(得分:0)

你可以使用Muaz Khan webrtc实验中的DetectRTC: https://github.com/muaz-khan/WebRTC-Experiment/tree/master/DetectRTC

使用:

DetectRTC.audioInputDevices
DetectRTC.audioOutputDevices
DetectRTC.videoInputDevices

获取设备。

答案 4 :(得分:0)

navigator.mediaDevices api在过去的大约十年中已经稳定。

您现在可以通过浏览器javascript执行此操作。

{
  navigator.mediaDevices.enumerateDevices()
  .then ( function (devices) {
      console.log(devices)
      const videoDevices = devices.filter(device => device.kind === 'videoinput')
      console.log(videoDevices)
  })
}

如果您的计算机上有任何视频设备,则在过滤videoDevices数组后,您会在devices数组中得到一些东西。

但是,除非您的程序已经调用getUserMedia()并获得许可,否则您(至少在Google Chrome浏览器中)无法知道您拥有多少个网络摄像头或它们的label值(名称)是多少。因为网络蠕变。