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
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();
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();
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;
};
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.
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)
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.
if (sourcevid.mozSrcObject) {
sourcevid.mozSrcObject.stop();
sourcevid.src = null;
} else {
sourcevid.src = "";
localStream.stop();
}