如何使用JavaScript检查Chrome浏览器是否正在使用网络摄像头

5
如果在Chrome中使用网络摄像头,该页面的选项卡上会有一个红点。如果其他页面尝试访问网络摄像头,则视频将变为黑色。我的问题是,能否使用JavaScript检查是否正在使用网络摄像头?如何实现?
通过使用navigator.getUserMedia,我尝试了以下代码:
navigator.getUserMedia = navigator.getUserMedia ||
    navigator.webkitGetUserMedia || navigator.mozGetUserMedia ||
    navigator.msGetUserMedia;

navigator.getUserMedia({ audio: true, video: true }, function (stream) {
    var mediaStreamTrack = stream.getVideoTracks()[0];
    if (typeof mediaStreamTrack != "undefined") {
        mediaStreamTrack.onended = function () {alert('Your webcam is busy!')}
    } else errorMessage('Permission denied!');
}, function (e) {alert("Error: " + e.name);});

将代码粘贴到正在播放视频的页面的控制台中时,没有响应。
有什么想法吗?谢谢!
1个回答

9
请改用MediaStreamTrack对象enabledreadyState属性。你可以使用JavaScript数组函数例如some()来遍历这些轨道,检查是否有任何一个已将enabled设置为true且readyState等于字符串'live':
navigator.getUserMedia = (navigator.getUserMedia ||
  navigator.webkitGetUserMedia ||
  navigator.mozGetUserMedia ||
  navigator.msGetUserMedia);

if (navigator.getUserMedia) {
  navigator.getUserMedia({
      audio: true,
      video: true
    },
    function(stream) {
      // returns true if any tracks have active state of true
      var result = stream.getVideoTracks().some(function(track) {
        return track.enabled && track.readyState === 'live';
      });

      if (result) {
        alert('Your webcam is busy!');
      } else {
        alert('Not busy');
      }
    },
    function(e) {
      alert("Error: " + e.name);
    });
}

希望这能有所帮助!

1
谢谢!这个答案有效。另一个问题:如果我想关闭流,我在函数(track){track.stop(); return...}中添加一行,但它并没有关闭流。为什么? - r ne
2
似乎这应该可以工作。然而,即使摄像头尚未在使用中,它仍然返回“您的网络摄像头正忙!” - spfursich
你的电脑上可能有什么正在使用摄像头的东西吗?例如摄像头驱动程序或者保持摄像头处于活动状态的浏览器插件? - Alexander Staroselsky
@rne 你解决了吗?我也试过同样的方法,但它没有释放相机资源。如果你成功了,请告诉我。谢谢。 - Jivan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接