arrêter le streaming webcam de getUserMedia sans rafraîchissement de la page [dupliquer]

cette question a déjà une réponse ici:

  • Stop / Close webcam qui est ouvert par navigator.getUserMedia 11 réponses

j'essaie de fermer la webcam avec la fonction javascript (elle doit être fermée après avoir reçu une réponse Ajax), mais il semble impossible de fermer sans rafraichissement de la page. Toutes les méthodes pour le fermer comme vidéo.src = null, vidéo.pause...etc ne fonctionne pas du tout dans un navigateur. La façon unique est de fermer le flux passé comme paramètre sur les fonctions de succès, il ya donc un moyen d'utiliser cet objet en dehors de la fonction de succès pour fermer la webcam?

je sais que cette question a déjà été posée ( Stop / Close webcam utilisant getUserMedia et RTCPeerConnection Chrome 25 ), mais mes besoins sont différent, donc j'aurais besoin d'une aide pour résoudre ce problème

merci!

EDIT: mon code de travail essayant de fermer la webcam:

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..c'est vraiment compliqué de poster ici le code XD

14
demandé sur Community 2013-04-10 15:49:51

7 réponses

vous devez arrêter l'objet LocalMediaStream en exécutant sa méthode stop() . J'ai eu des problèmes similaires. Ce que vous devez faire est:

conserver une référence au LocalMediaStream dans la fonction de rappel onSuccess de l'exécution getUserMedia() :

var localStream;

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

Arrêter la LocalMediaStream en cas de besoin:

localStream.stop(); 

Plus d'info dans mon propre question (et réponse ).

28
répondu asgoth 2017-05-23 12:34:43

sauvegarder une référence au LocalMediaStream comme asgoth suggère est correct, mais pour moi dans Chrome 47. localStream.stop(); m'a donné une erreur:

Uncaught TypeError: localStream.stop is not a function

Je l'ai fait fonctionner en appelant:

localStream.getVideoTracks()[0].stop();
35
répondu Jay P. 2015-12-11 20:31:38

ajout à réponse d'asgoth

localStream.stop () est déprécié dans Chrome 45, enlevé dans Chrome 47

si vous appelez .stop () à partir de plusieurs endroits, vous pouvez utiliser l'Assistant suivant pour la fonction stop pour garder la logique à un endroit.

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;
};
9
répondu Peter Mols 2017-05-23 12:10:31

j'avais un problème de fermeture de la piste vidéo (caméra frontale) et d'ouverture d'une piste alternative (caméra arrière) dans Chrome 49. J'ai trouvé que MediaStream.stop() a été déprécié depuis la version 45, et a été remplacé par MediaStreamTrack.stop() . Vous pouvez lire plus d'un affichage sur le site de développeur de Google par Sam Dutton.

1
répondu Steve 2016-04-11 18:56:26

cela semble être une zone buggy dans Chrome, et le comportement est en constante évolution. Cela ne semble fonctionner que si vous êtes connecté via http (pas https):

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

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

pour une raison étrange, cela ne fonctionne pas sur SSL (https) (vérifié sur Chrome Pour Linux, Ver 27 Dev)

0
répondu ACEGL 2013-04-10 12:34:14

pour se débarrasser du symbole rouge à l'onglet du navigateur et pour désactiver les deux, le vidéo et audio flux à la réception de l'une de ces erreurs

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

itérez les pistes trouvées et arrêtez-les toutes.

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

note: _webRTCStream égale localStream , dépend d'une bibliothèque que vous utilisez.

0
répondu Qwerty 2015-12-30 13:48:03
if (sourcevid.mozSrcObject) {
  sourcevid.mozSrcObject.stop();
  sourcevid.src = null;
} else {
  sourcevid.src = "";
  localStream.stop();
}
-1
répondu Ashisha Nautiyal 2013-04-24 09:13:31