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 rafraîchir la page. Toutes les méthodes pour le fermer comme video.src = null, video.pause ... etc ne fonctionnent pas du tout dans un navigateur. La manière unique est de fermer le flux passé en paramètre sur les fonctions de réussite, donc existe-t-il un moyen d'utiliser cet objet en dehors de la fonction de réussite pour fermer la webcam?
Je sais que cette question a déjà été posée ( Stop/Close webcam using getUserMedia and RTCPeerConnection Chrome 25 ), mais mes besoins sont différents, donc j'aurais besoin d'aide pour résoudre ce problème
merci!
EDIT: Mon code de travail tente 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..il est vraiment compliqué de poster ici le code XD
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, c'est:
Conservez une référence à 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êtez LocalMediaStream si nécessaire:
localStream.stop();
Enregistrer une référence au LocalMediaStream
comme le suggère asgoth 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éconseillé dans Chrome 45, supprimé dans Chrome 47
Si vous appelez .stop () à partir de plusieurs endroits, vous pouvez utiliser l'aide suivante pour la fonction d'arrêt 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;
};
Je rencontrais des problèmes pour fermer la piste du flux vidéo (caméra orientée vers l'avant) et ouvrir une piste alternative (caméra orientée vers l'arrière) dans Chrome 49. J'ai trouvé que MediaStream.stop()
a été obsolète depuis la version 45, et a été remplacé par MediaStreamTrack.stop()
. Vous pouvez en lire plus à partir d'un publication sur le site de développeur de Google par Sam Dutton.
Cela semble être une zone de buggy dans Chrome, et le comportement change constamment. Cela semble fonctionner, uniquement 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 dans l'onglet du navigateur et pour désactiver les deux, les flux vidéo et audio lors de 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
parcourir les pistes trouvées et les arrêter toutes.
if (_webRTCStream.stop) {
_webRTCStream.stop() // idk what this does, left here for legacy reasons..?
} else {
_webRTCStream.getTracks().forEach(function(track) { track.stop() })
}
remarque: _webRTCStream
est égal à localStream
, dépend de la bibliothèque que vous utilisez.