Stoppen / Schließen Sie die Webcam, die von navigator.getUserMedia geöffnet wird

139

Ich habe eine Webcam mit dem folgenden JavaScript-Code geöffnet: navigator.getUserMedia

Gibt es JavaScript-Code zum Stoppen oder Schließen der Webcam? Vielen Dank an alle.

Shih-En Chou
quelle

Antworten:

198

BEARBEITEN

Seit diese Antwort ursprünglich veröffentlicht wurde, hat sich die Browser-API geändert. .stop()ist für den Stream, der an den Rückruf übergeben wird, nicht mehr verfügbar. Der Entwickler muss auf die Tracks zugreifen, aus denen der Stream besteht (Audio oder Video), und jeden einzeln stoppen.

Weitere Informationen finden Sie hier: https://developers.google.com/web/updates/2015/07/mediastream-deprecations?hl=de#stop-ended-and-active

Beispiel (über den obigen Link):

stream.getTracks().forEach(function(track) {
  track.stop();
});

Die Browserunterstützung kann abweichen.

Ursprüngliche Antwort

navigator.getUserMediaWenn Sie im erfolgreichen Rückruf einen Stream erhalten, können Sie .stop()diesen Stream aufrufen , um die Aufzeichnung zu stoppen (zumindest in Chrome scheint FF dies nicht zu mögen).

andrei
quelle
2
Ich denke, stream.stop()funktioniert nicht für Chrome, mediaRecorder.stop()stoppt die Aufnahme, während es den vom Browser bereitgestellten Stream nicht stoppt. Können Sie sich diese stackoverflow.com/questions/34715357/…
Muthu
@Muntu, ich denke es kommt darauf an, für mich funktioniert stream.stop () (in Chrome). Weil ich einen webRTC-Stream habe. Wenn Sie also im Browser mediaRecorder.stop () aufnehmen, funktioniert das?
Johan Hoeksma
Ja, aber dies wirft ein anderes Problem auf. Diese Funktion zum Beenden der Aufnahme sollte nach einigen Sekunden / Minuten Aufnahme erfolgen. Wie können Sie dies steuern: um es nach einer Standardaufnahmezeit zu stoppen? Danke dir!
Emanuela Colta
1
Dadurch werden die Streams gestoppt, aber die Videoanzeige auf Chrome bleibt bis zum erneuten Laden aktiv. Gibt es eine Möglichkeit, das auch zu entfernen?
Cybersupernova
@Cybersupernova Haben Sie eine Lösung dafür gefunden? Ich denke,
Seitenaktualisierung
59

Verwenden Sie eine der folgenden Funktionen:

// stop both mic and camera
function stopBothVideoAndAudio(stream) {
    stream.getTracks().forEach(function(track) {
        if (track.readyState == 'live') {
            track.stop();
        }
    });
}

// stop only camera
function stopVideoOnly(stream) {
    stream.getTracks().forEach(function(track) {
        if (track.readyState == 'live' && track.kind === 'video') {
            track.stop();
        }
    });
}

// stop only mic
function stopAudioOnly(stream) {
    stream.getTracks().forEach(function(track) {
        if (track.readyState == 'live' && track.kind === 'audio') {
            track.stop();
        }
    });
}

Hinweis: Die Antwort wurde aktualisiert am: 06/09/2020

Muaz Khan
quelle
2
Danke dafür. mediaStream.stop ist veraltet.
Dan Brown
@ DanBrown was ist deine Lösung?
Webwoman
Ich würde dringend davon abraten, den Prototyp einer nativen API zu ändern, um eine Funktion wiederherzustellen , die offiziell veraltet und aus dem Browser entfernt wurde. Es ist unregelmäßig und kann später zu Verwirrung führen. Wenn Sie alle Tracks in einem Stream stoppen müssen, warum nicht einfach stream.getTracks().forEach(track => { track.stop() })? Oder wenn Sie dies wirklich oft genug tun, um eine Abkürzung zu rechtfertigen, können Sie jederzeit eine Hilfsfunktion wie definieren stopAllTracks(stream).
callum
45

Nicht verwenden stream.stop(), es ist veraltet

MediaStream-Abschreibungen

Verwenden stream.getTracks().forEach(track => track.stop())

sol404
quelle
1
Vielen Dank, es funktioniert völlig gut, aufgrund der Abwertung verwirrt es die Leute, was man arbeitet, aber ab März 2019 funktioniert die obige Lösung gut in Chrom. 🙂
PANKAJ NAROLA
10

FF, Chrome und Opera hat begonnen aussetzt getUserMediaüber navigator.mediaDevicesnun als Standard (ändern könnte :)

Online-Demo

navigator.mediaDevices.getUserMedia({audio:true,video:true})
    .then(stream => {
        window.localStream = stream;
    })
    .catch( (err) =>{
        console.log(err);
    });
// later you can do below
// stop both video and audio
localStream.getTracks().forEach( (track) => {
track.stop();
});
// stop only audio
localStream.getAudioTracks()[0].stop();
// stop only video
localStream.getVideoTracks()[0].stop();
Sasi Varunan
quelle
9

Starten von Webcam Video mit verschiedenen Browsern

Für Opera 12

window.navigator.getUserMedia(param, function(stream) {
                            video.src =window.URL.createObjectURL(stream);
                        }, videoError );

Für Firefox Nightly 18.0

window.navigator.mozGetUserMedia(param, function(stream) {
                            video.mozSrcObject = stream;
                        }, videoError );

Für Chrome 22

window.navigator.webkitGetUserMedia(param, function(stream) {
                            video.src =window.webkitURL.createObjectURL(stream);
                        },  videoError );

Stoppen von Webcam-Videos mit verschiedenen Browsern

Für Opera 12

video.pause();
video.src=null;

Für Firefox Nightly 18.0

video.pause();
video.mozSrcObject=null;

Für Chrome 22

video.pause();
video.src="";

Damit geht die Webcam jedes Mal aus ...

Alain Saurat
quelle
10
Dadurch wird das Video nur nicht mehr im <video> -Tag angezeigt, die Kamera jedoch nicht.
G. Führ
8

Angenommen, wir haben Streaming in Video-Tag und ID ist Video - <video id="video"></video>dann sollten wir folgenden Code haben -

var videoEl = document.getElementById('video');
// now get the steam 
stream = videoEl.srcObject;
// now get all tracks
tracks = stream.getTracks();
// now close each track by having forEach loop
tracks.forEach(function(track) {
   // stopping every track
   track.stop();
});
// assign null to srcObject of video
videoEl.srcObject = null;
Veshraj Joshi
quelle
6

Sie können den Stream direkt mit dem Stream-Objekt beenden, das im Success-Handler an getUserMedia zurückgegeben wird. z.B

localMediaStream.stop()

video.src=""oder nullwürde einfach die Quelle aus dem Video-Tag entfernen. Die Hardware wird nicht freigegeben.

Bhavin
quelle
Aha. Ich werde es später versuchen.
Shih-En Chou
1
Nicht wirklich ... Auf Firefox funktioniert nicht. Die Dokumente erwähnen, dass diese Methode nicht in allen Browsern implementiert ist ...
Sdra
Die obige Lösung hat bei mir nicht funktioniert. Das hat es geschafft.
Scottmas
5

Versuchen Sie die folgende Methode:

var mediaStream = null;
    navigator.getUserMedia(
        {
            audio: true,
            video: true
        },
        function (stream) {
            mediaStream = stream;
            mediaStream.stop = function () {
                this.getAudioTracks().forEach(function (track) {
                    track.stop();
                });
                this.getVideoTracks().forEach(function (track) { //in case... :)
                    track.stop();
                });
            };
            /*
             * Rest of your code.....
             * */
        });

    /*
    * somewhere insdie your code you call
    * */
    mediaStream.stop();
imal hasaranga perera
quelle
4

Wenn das .stop()veraltet ist, denke ich nicht, dass wir es wie die @ MuazKhan-Dosis erneut hinzufügen sollten. Dies ist ein Grund, warum Dinge veraltet sind und nicht mehr verwendet werden sollten. Erstellen Sie stattdessen einfach eine Hilfsfunktion ... Hier ist eine weitere es6-Version

function stopStream (stream) {
    for (let track of stream.getTracks()) { 
        track.stop()
    }
}
Endlos
quelle
1
for (let track of stream.getTracks()) { track.stop() }
guest271314
7
stream.getTracks().forEach(function (track) { track.stop() })in ES5 vermeidet dies langwierige babel-Transformationen vonfor of
fregante
3

Da Sie die Tracks benötigen, um das Streaming zu schließen, und Sie das streamObjekt benötigen , um zu den Tracks zu gelangen, lautet der Code, den ich mithilfe der obigen Antwort von Muaz Khan verwendet habe, wie folgt:

if (navigator.getUserMedia) {
    navigator.getUserMedia(constraints, function (stream) {
        videoEl.src = stream;
        videoEl.play();
        document.getElementById('close').addEventListener('click', function () {
            stopStream(stream);
        });
    }, errBack);

function stopStream(stream) {
console.log('stop called');
stream.getVideoTracks().forEach(function (track) {
    track.stop();
});

Natürlich werden dadurch alle aktiven Videospuren geschlossen. Wenn Sie mehrere haben, sollten Sie entsprechend auswählen.

mcy
quelle
2

Sie müssen alle Titel (von Webcam, Mikrofon) anhalten:

localStream.getTracks().forEach(track => track.stop());
TopReseller
quelle
0

Die Verwendung von .stop () im Stream funktioniert auf Chrome, wenn eine Verbindung über http hergestellt wird. Es funktioniert nicht bei Verwendung von ssl (https).

ACEGL
quelle
0

Bitte überprüfen Sie dies: https://jsfiddle.net/wazb1jks/3/

navigator.getUserMedia(mediaConstraints, function(stream) {
    window.streamReference = stream;
}, onMediaError);

Höre auf, aufzunehmen

function stopStream() {
    if (!window.streamReference) return;

    window.streamReference.getAudioTracks().forEach(function(track) {
        track.stop();
    });

    window.streamReference.getVideoTracks().forEach(function(track) {
        track.stop();
    });

    window.streamReference = null;
}

Akshay Italiya
quelle
0

Der folgende Code hat bei mir funktioniert:

public vidOff() {

      let stream = this.video.nativeElement.srcObject;
      let tracks = stream.getTracks();

      tracks.forEach(function (track) {
          track.stop();
      });

      this.video.nativeElement.srcObject = null;
      this.video.nativeElement.stop();
  }
TechDo
quelle
0

Starten und Stoppen der Webkamera (Update 2020 React es6)

Starten Sie die Webkamera

stopWebCamera =()=>

       //Start Web Came
      if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
        //use WebCam
        navigator.mediaDevices.getUserMedia({ video: true }).then(stream => {
          this.localStream = stream;
          this.video.srcObject = stream;
          this.video.play();
        });
      }
 }

Stoppen Sie die Wiedergabe von Webkameras oder Videos im Allgemeinen

stopVideo =()=>
{
        this.video.pause();
        this.video.src = "";
        this.video.srcObject = null;

         // As per new API stop all streams
        if (this.localStream)
          this.localStream.getTracks().forEach(track => track.stop());
}

Die Funktion zum Stoppen der Webkamera funktioniert auch bei Videostreams:

  this.video.src = this.state.videoToTest;
  this.video.play();
Hitesh Sahu
quelle
-1

Haben Sie eine Referenz von Stream Form successHandle

var streamRef;

var handleVideo = function (stream) {
    streamRef = stream;
}

//this will stop video and audio both track
streamRef.getTracks().map(function (val) {
    val.stop();
});
Pankaj Anupam
quelle
1
Diese Antwort ist im Wesentlichen dieselbe wie einige andere, die bereits gegeben wurden.
Dan Dascalescu
Bei weitem nicht @DanDascalescu. In diesem Beispiel zeigt er deutlich seine Fähigkeit, die Kartenfunktion abzurufen.
Charliebeck mit