2013-04-10 18 views
13

Sto provando a chiudere la webcam con la funzione javascript (deve essere chiusa dopo aver ricevuto una risposta Ajax), ma sembra impossibile chiudere senza aggiornare la pagina. Tutti i metodi per chiuderlo come video.src = null, video.pause ... ecc non funzionano affatto su nessun browser. Il modo unico è quello di chiudere il flusso passato come parametro sulle funzioni di successo, quindi c'è un modo per utilizzare questo oggetto al di fuori della funzione successo per chiudere la webcam?interrompe lo streaming della webcam di getUserMedia senza aggiornare la pagina

So che questa domanda è stato chiesto prima (Stop/Close webcam using getUserMedia and RTCPeerConnection Chrome 25), ma le mie esigenze sono diverse, così mi avrebbe bisogno di aiuto per risolvere questo problema

grazie!

EDIT: Il mio codice di lavoro cercando di chiudere 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..it è davvero complicato per pubblicare qui il codice XD

risposta

28

È necessario fermare l'oggetto LocalMediaStream eseguendo il suo metodo stop() . Ho avuto problemi simili. Quello che dovete fare è:

Mantenere un riferimento al LocalMediaStream nella funzione di callback onSuccess del getUserMedia() esecuzione:

var localStream; 

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

Arrestare il LocalMediaStream dove necessario:

localStream.stop(); 

Più informazioni in il mio question (e answer).

+0

Mmmm ok, ho provato a inserire qualcosa di simile nel mio codice ma non so come, perché il tuo codice è completamente diverso. Ho visto anche il tuo vecchio problema ma è ancora più difficile da capire per me. Perché stai salvando l'oggetto stream nell'oggetto "self" se poi usi "this" per fermare lo stream? Inserirò il mio codice qui, quindi potrebbe essere che tu possa dirmi come implementare la tua soluzione: – user2158954

+0

Ammetto che usare "io" potrebbe confondere senza l'intero contesto. Ho adattato la mia risposta un po '. Basta mantenere il riferimento in una variabile globale o con scope localStream. – asgoth

+0

incredibile! Ho appena provato su Chrome e Firefox e funziona perfettamente !! Ora che ricordo, ho provato anche qualcosa di identico una volta, ma non ha funzionato. Ora sarebbe perfetto se potessi inviare l'acquisizione dell'immagine su tela come richiesta senza usare la noiosa ajax, ma questo è un altro argomento jej. Grazie mille! La cosa unica è: posso usarlo con HTTPS? – user2158954

0

Questa sembra un'area buggata in Chrome e il comportamento è in costante evoluzione. Questo sembra funzionare, ma solo se si è connessi tramite http (non https):

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

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

Per qualche strana ragione questo non funziona in SSL (https) (Controllato su Chrome per Linux, Ver 27 Dev)

+0

scusa ma il tuo metodo non funziona per me. Penso di aver visto qualcosa di simile qualche tempo fa ma non ha funzionato. Ho provato sia Chrome che Firefox nelle ultime versioni. Inoltre, dovrò implementare con HTTPS .. – user2158954

+0

L'ho testato solo su Chrome 27 dev su Linux. Qual è il tuo setup? Se hai bisogno di HTTPS (come faccio io), non lo farà comunque per te. Ho aperto un problema sul tracker dei problemi WebRTC. [link] (https://code.google.com/p/webrtc/issues/detail?id=1622) – ACEGL

+0

oh shit XD! La mia applicazione deve funzionare su HTTPS .. Io uso Windows 7 64 bit, Enterprise Edition. La mia app Web è in esecuzione su Eclipse Java EE IDE per gli sviluppatori Web, versione Indigo Service Release 2. Ho testato su Firefox 19.0.2 e Chrome 26.0.1410.43. Funziona anche in Opera 12.15 .. Umm, non sarebbe un problema per me se potessi usare le funzioni request.getParameter da un servlet per prendere l'immagine della tela nel formato dataURL. Non ho trovato il modo di farlo, forse è impossibile. Hai provato qualcosa del genere? – user2158954

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

Salvataggio di un riferimento al LocalMediaStream come asgoth suggerisce è corretto, ma per me in Chrome 47. localStream.stop(); mi ha dato un errore:

Uncaught TypeError: localStream.stop is not a function 

I Got It lavorare chiamando:

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

Attualmente (a dicembre 2015) questa è una risposta importante. Abbiamo riscontrato questo problema in un'app Web che ha causato l'arresto anomalo della scheda in Chrome con il messaggio "Aw, snap". Questo ha risolto il problema per noi. –

+0

Questo è correlato a un errore TokBox/OpenTok '_webRTCStream.stop() non è una funzione'. – Qwerty

+1

Ancora non si fermerà con questo metodo. C'è anche una funzione removeTrack che puoi usare per rimuovere tutte le tracce, ma la mia webcam è ancora accesa. – Dtipson

0

per sbarazzarsi del simbolo rosso alla scheda del browser e per disabilitare entrambi, il video e audio flussi dopo aver ricevuto uno di questi errori

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

iterare sulle tracce trovate e fermarle tutte.

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

nota: _webRTCStream uguale localStream, dipende da una libreria che si sta utilizzando.

8

aggiunta alla asgoth's answer

localStream.stop() is deprecated in Chrome 45, removed in Chrome 47

Se u chiamata .Stop() da più posti, è possibile utilizzare il seguente aiuto per la funzione di arresto per mantenere la logica in un unico posto.

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; 
}; 
1

ho avuto un problema chiudendo la traccia flusso video (fotocamera frontale rivolto) e apertura di una traccia alternativa (posteriore fronte fotocamera) in Chrome 49. Ho trovato che MediaStream.stop() è sconsigliata dalla versione 45, ed è stato sostituito con MediaStreamTrack.stop(). Puoi leggere ulteriori informazioni dallo posting sul sito degli sviluppatori di Google di Sam Dutton.

Problemi correlati