使用 getUserMedia 后关闭网络摄像头/摄像头 [重复]

Posted

技术标签:

【中文标题】使用 getUserMedia 后关闭网络摄像头/摄像头 [重复]【英文标题】:Turn off webcam/camera after using getUserMedia [duplicate] 【发布时间】:2015-03-24 06:39:18 【问题描述】:

我正在开发一个使用后台页面访问用户网络摄像头的 Chrome 扩展程序。

用户可以选择关闭摄像头。

信息流似乎已关闭。相关功能不再接收流。但是网络摄像头灯(目前正在 mac book pro 上开发和测试)没有关闭。

有什么想法吗?

这是我设置流的代码:

if (navigator.webkitGetUserMedia!=null) 

    var options =  
        video:true, 
        audio:false 
    ;  
    navigator.webkitGetUserMedia(options, 
        function(stream)  
        vid.src = window.webkitURL.createObjectURL(stream);
        localstream = stream;
        vid.play();
        console.log("streaming");
    , 
        function(e)  
        console.log("background error : " + e);
        ); 
 

这是我关闭流的方法:

function vidOff() 
    clearInterval(theDrawLoop);
    ExtensionData.vidStatus = 'off';
    vid.pause();
    vid.src = "";
    localstream.stop();
    DB_save();
    console.log("Vid off");

我有什么明显的遗漏吗?

【问题讨论】:

我不知道扩展或背景页面,但your code 在我的 macbook pro fwiw 上的常规内容处理中工作正常(灯熄灭)。你有任何错误吗? 遗憾的是没有。我认为这一定是因为它是一个不可见的过程,它没有更新。 【参考方案1】:

localstream.stop() 已被贬值,不再有效。看到这个问题和答案: Stop/Close webcam which is opened by navigator.getUserMedia

还有这个链接:

https://developers.google.com/web/updates/2015/07/mediastream-deprecations?hl=en#stop-ended-and-active

基本上你将localstream.stop() 更改为localstream.getTracks()[0].stop();

这里是问题中更新的来源:

<html>
<head>
<script>
var console =  log: function(msg)  div.innerHTML += "<p>" + msg + "</p>";  ;

var localstream;

if (navigator.mediaDevices.getUserMedia !== null) 
  var options =  
    video:true, 
    audio:false 
  ;  
  navigator.webkitGetUserMedia(options, function(stream)  
    vid.src = window.URL.createObjectURL(stream);
    localstream = stream;
    vid.play();
    console.log("streaming");
  , function(e)  
    console.log("background error : " + e.name);
  ); 


function vidOff() 
  //clearInterval(theDrawLoop);
  //ExtensionData.vidStatus = 'off';
  vid.pause();
  vid.src = "";
  localstream.getTracks()[0].stop();
  console.log("Vid off");

</script>
</head>
<body>
<video id="vid"   muted="muted" autoplay></video><br>
<button onclick="vidOff()">vidOff!</button><br>
<div id="div"></div>
</body>
</html>

【讨论】:

【参考方案2】:

上面的代码有效 - 如@jib here 使用上面的代码所示:

function vidOff() 
    vid.pause();
    vid.src = "";
    localstream.stop();

问题在于它是一个持久的背景页面。我正在换用 event pages 作为 Chrome 扩展程序。

【讨论】:

当我使用小提琴并单击“视频关闭”时,视频确实停止,但网络摄像头仍然打开。

以上是关于使用 getUserMedia 后关闭网络摄像头/摄像头 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 getUserMedia 和 RTCPeerConnection Chrome 25 停止/关闭网络摄像头

在html5中使用navigator.getUserMedia打开相机,要怎样进行关闭?

哪个相机会在移动设备中打开 getUserMedia API?前还是后?

如何使用 getusermedia 让网络摄像头在 Firefox 上可靠地工作?

网络摄像头 getUserMedia API - AngularJS 错误?

无法在第一页加载时在 Google Chrome 中使用 HTML5 和 getUserMedia() 从网络摄像头拍照