Подтвердить что ты не робот

Остановить веб-камеру потоком getUserMedia без обновления страницы

Я пытаюсь закрыть веб-камеру с помощью функции javascript (она должна быть закрыта после получения некоторого ответа Ajax), но это невозможно закрыть, не обновляя страницу. Все методы для его закрытия как video.src= null, video.pause... и т.д. Вообще не работают в любом браузере. Единственный способ - закрыть поток, переданный как параметр, в функции успеха, так что есть какой-либо способ использовать этот объект за пределами успеха функции, чтобы закрыть веб-камеру?

Я знаю, что этот вопрос задавался раньше (Stop/Close webcam с использованием getUserMedia и RTCPeerConnection Chrome 25), но мои потребности разные, поэтому мне нужно будет немного помочь решить эту проблему

спасибо!

EDIT: мой рабочий код пытается закрыть веб-камеру:

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

4b9b3361

Ответ 1

Вам нужно остановить объект LocalMediaStream, выполнив его метод stop(). У меня были подобные проблемы. Что вам нужно сделать:

Сохраняйте ссылку на LocalMediaStream в функции обратного вызова onSuccess выполнения getUserMedia():

var localStream;

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

Остановить LocalMediaStream, если необходимо:

localStream.stop(); 

Дополнительная информация в моей questionanswer).

Ответ 2

Сохранение ссылки на LocalMediaStream похожее на asgoth подсказки верное, но для меня в Chrome 47. localStream.stop(); дал мне ошибку:

Uncaught TypeError: localStream.stop is not a function

Я получил его для работы, позвонив:

localStream.getVideoTracks()[0].stop();

Ответ 3

Дополнить asgoth answer

localStream.stop() устарел в Chrome 45, удален в Chrome 47

Если u вызывает .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;
};

Ответ 4

У меня возникла проблема с закрытием дорожки видеопотока (камера с фронтальной передней панелью) и открытием альтернативной дорожки (камера заднего вида) в Chrome 49. Я обнаружил, что MediaStream.stop() устарел с версии 45 и был заменен на MediaStreamTrack.stop(). Вы можете прочитать больше из размещения на сайте разработчика Google Сэмом Даттоном.

Ответ 5

Это, кажется, ошибка в 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 для Linux, Ver 27 Dev)

Ответ 6

Чтобы избавиться от красного символа на вкладке браузера и для отключения обоих потоков видео и аудио после получения одной из этих ошибок

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() })
}

note: _webRTCStream equals localStream, зависит от библиотеки, которую вы используете.

Ответ 7

if (sourcevid.mozSrcObject) {
  sourcevid.mozSrcObject.stop();
  sourcevid.src = null;
} else {
  sourcevid.src = "";
  localStream.stop();
}