16

我正在尝试使用 javascript 函数关闭网络摄像头(它必须在收到一些 Ajax 响应后关闭),但如果不刷新页面似乎无法关闭。关闭它的所有方法,如 video.src = null、video.pause...等,在任何浏览器中都不起作用。唯一的方法是关闭作为参数传递给成功函数的流,那么有什么方法可以在函数成功之外使用这个对象来关闭网络摄像头?

我知道之前有人问过这个问题(使用 getUserMedia 和 RTCPeerConnection Chrome 25 停止/关闭网络摄像头),但我的需求不同,所以我需要一些帮助来解决这个问题

谢谢!

编辑:我的工作代码试图关闭网络摄像头:

navigator.getUserMedia = navigator.getUserMedia || navigator.mozGetUserMedia ||  navigator.webkitGetUserMedia || navigator.msGetUserMedia;
if(navigator.getUserMedia){
  var video_constraints = {
    mandatory: {
       maxHeight: 480,
       maxWidth: 640 
    },
    optional: []
  };
  var self = this;
  self.navigator.getUserMedia({
      audio: false,
      video: video_constraints
  }, self.onSuccess, onError);
}
else{
  alert('An error has occurred starting the webcam stream, please revise the instructions to fix the problem');
}

function onSuccess(stream) {
  var video = document.getElementById('webcam');

  if(navigator.webkitGetUserMedia || navigator.mozGetUserMedia){
      video.src = window.URL.createObjectURL(stream);
  }
  else if(navigator.msGetUserMedia){
      //future implementation over internet explorer
  }
  else{
      video.src = stream;
  }
  self.localStream = stream;
  video.play();
}
function onError() {
  alert('There has been a problem retrieving the streams - did you allow access?');
}

function closeWebcamConnection(){
  this.localStream.stop();
}

uff..在这里发布代码真的很复杂XD

4

7 回答 7

51

保存对LocalMediaStreamasgoth 建议的引用是正确的,但在 Chrome 47 中对我来说。localStream.stop();给了我一个错误:

未捕获的类型错误:localStream.stop 不是函数

我通过调用它来工作:

localStream.getVideoTracks()[0].stop();
于 2015-12-11T20:31:38.150 回答
30

您需要LocalMediaStream通过执行其stop()方法来停止对象。我有类似的问题。你需要做的是:

LocalMediaStream在执行的 onSuccess 回调函数中保留一个引用getUserMedia()

var localStream;

onUserMediaSuccess = function(stream) {
   // attach to a video element
   ...
   // keep a reference
   localStream = stream;
};

在需要的地方停止 LocalMediaStream:

localStream.stop(); 

在我自己的问题(和答案)中有更多信息。

于 2013-04-10T12:23:16.747 回答
10

除了asgoth 的答案

localStream.stop() 在 Chrome 45 中已弃用,在 Chrome 47 中已删除

如果你从多个地方调用 .stop() ,你可以使用以下帮助函数的 stop 函数来将逻辑保持在一个地方。

var localStream;

onUserMediaSuccess = function(stream) {

  // re-add the stop function
  if(!stream.stop && stream.getTracks) {
    stream.stop = function(){         
      this.getTracks().forEach(function (track) {
         track.stop();
      });
    };
  }

  // attach to a video element
  ...
  // keep a reference
  localStream = stream;
};
于 2016-01-06T14:25:28.160 回答
2

这似乎是 Chrome 中的一个错误区域,并且行为在不断变化。这似乎有效,只有当您通过 http(不是 https)连接时:

var myStream;
function successCallback( stream ) {
    ...
    myStream = stream; // used to close the stream later
}

function closeStream(){
   myStream.stop(); 
   myStream = null;
}

由于某些奇怪的原因,这在 SSL (https) 上不起作用(在 Chrome for Linux,Ver 27 Dev 上检查)

于 2013-04-10T12:34:14.127 回答
1

我在 Chrome 49 中关闭视频流轨道(前置摄像头)和打开备用轨道(后置摄像头)时遇到问题。我发现MediaStream.stop()自版本 45 以来已弃用,并已替换为MediaStreamTrack.stop(). 您可以从Sam Dutton 在 Google 开发者网站上的帖子中了解更多信息。

于 2016-04-11T18:56:26.690 回答
0

为了摆脱浏览器选项卡上的红色符号并禁用两者,在收到这些错误之一时视频音频流

Uncaught TypeError: localStream.stop is not a function
Uncaught TypeError: _webRTCStream.stop is not a function // TokBox, OpenTok

遍历找到的轨道并停止它们。

if (_webRTCStream.stop) {
  _webRTCStream.stop() // idk what this does, left here for legacy reasons..?
} else {
  _webRTCStream.getTracks().forEach(function(track) { track.stop() })
}

注意:_webRTCStreamequals localStream,取决于您使用的库。

于 2015-12-30T13:48:03.740 回答
-1
if (sourcevid.mozSrcObject) {
  sourcevid.mozSrcObject.stop();
  sourcevid.src = null;
} else {
  sourcevid.src = "";
  localStream.stop();
}
于 2013-04-24T09:13:31.713 回答