Stop / Close webcam yang dibuka oleh navigator.getUserMedia

139

Saya membuka webcam dengan menggunakan kode JavaScript berikut: navigator.getUserMedia

Apakah ada kode JavaScript untuk menghentikan atau menutup webcam? Terimakasih semuanya.

Shih-En Chou
sumber

Jawaban:

199

EDIT

Karena jawaban ini awalnya diposting, API peramban telah berubah. .stop()tidak lagi tersedia di aliran yang diteruskan ke panggilan balik. Pengembang harus mengakses trek yang membentuk aliran (audio atau video) dan menghentikan masing-masing secara individual.

Info lebih lanjut di sini: https://developers.google.com/web/updates/2015/07/mediastream-deprecations?hl=en#stop-ended-and-active

Contoh (dari tautan di atas):

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

Dukungan browser mungkin berbeda.

Jawaban asli

navigator.getUserMediamemberi Anda aliran dalam panggilan balik yang berhasil, Anda dapat memanggil .stop()aliran itu untuk menghentikan rekaman (setidaknya di Chrome, sepertinya FF tidak menyukainya)

andrei
sumber
2
Saya pikir tidak stream.stop()berfungsi untuk chrome, mediaRecorder.stop()menghentikan rekaman, sedangkan itu tidak menghentikan aliran yang disediakan oleh browser. Bisakah Anda melihat ke stackoverflow.com/questions/34715357/…
Muthu
@ Ubuntu, saya pikir itu tergantung, bagi saya stream.stop () berfungsi (dalam chrome). Karena saya memiliki aliran webRTC. Jadi, jika Anda merekam di browser mediaRecorder.stop () akan berfungsi?
Johan Hoeksma
ya, tapi ini menimbulkan masalah lain. Fungsi untuk menghentikan perekaman ini harus terjadi setelah memungkinkan beberapa detik / menit perekaman. Bagaimana Anda bisa mengontrol ini: untuk menghentikannya setelah waktu perekaman default? Terima kasih!
Emanuela Colta
1
Ini menghentikan streaming tetapi indikator video pada chrome masih tetap aktif sampai memuat ulang. Apakah ada cara untuk menghapusnya juga?
Cybersupernova
@Cybersupernova Apakah Anda menemukan solusi untuk ini? Saya pikir penyegaran halaman mungkin berhasil
samayo
59

Gunakan salah satu dari fungsi ini:

// 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();
        }
    });
}

Catatan: Jawabannya diperbarui pada: 06/09/2020

Muaz Khan
sumber
2
Terima kasih untuk ini. mediaStream.stop sedang tidak digunakan lagi.
Dan Brown
@ DanBrown apa solusi Anda?
Webwoman
Saya akan sangat menyarankan memodifikasi prototipe API asli untuk mengembalikan fitur yang telah secara resmi ditinggalkan dan dihapus dari browser. Itu tidak teratur dan kemungkinan akan menyebabkan kebingungan nanti. Ketika Anda perlu menghentikan semua trek dalam aliran, mengapa tidak lakukan saja stream.getTracks().forEach(track => { track.stop() })? Atau jika Anda benar-benar cukup sering melakukan hal ini untuk membenarkan steno, Anda selalu dapat mendefinisikan fungsi pembantu stopAllTracks(stream).
callum
45

Jangan gunakan stream.stop(), sudah usang

Penghentian MediaStream

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

sol404
sumber
1
Terima kasih banyak, ini bekerja dengan sangat baik, karena penyusutan itu membingungkan orang-orang yang bekerja tetapi pada Maret-2019 solusi di atas bekerja dengan baik di chrome .. 🙂
PANKAJ NAROLA
10

FF, Chrome dan Opera telah mulai mengekspos getUserMediamelalui navigator.mediaDevicessebagai standar sekarang (Mungkin berubah :)

demo online

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
sumber
9

Memulai Video Webcam dengan berbagai browser

Untuk Opera 12

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

Untuk Firefox Nightly 18.0

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

Untuk Chrome 22

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

Menghentikan Video Webcam dengan browser yang berbeda

Untuk Opera 12

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

Untuk Firefox Nightly 18.0

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

Untuk Chrome 22

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

Dengan ini lampu Webcam mati setiap ...

Alain Saurat
sumber
10
Ini hanya berhenti menampilkan video dalam tag <video>, tetapi tidak menghentikan kamera.
G. Führ
8

Misalkan kita memiliki streaming dalam tag video dan id adalah video - <video id="video"></video>maka kita harus memiliki kode berikut -

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
sumber
6

Anda dapat mengakhiri streaming secara langsung menggunakan objek stream yang dikembalikan di penangan sukses ke getUserMedia. misalnya

localMediaStream.stop()

video.src=""atau nullhanya akan menghapus sumber dari tag video. Itu tidak akan melepaskan perangkat keras.

Bhavin
sumber
Saya melihat. Saya akan mencobanya nanti.
Shih-En Chou
1
Tidak juga ... Di firefox tidak berfungsi. Dokumen menyebutkan bahwa metode ini tidak diterapkan di semua browser ...
Sdra
Solusi di atas tidak berhasil untuk saya. Ini berhasil.
Scottmas
5

Coba metode di bawah ini:

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
sumber
4

Jika .stop()sudah usang maka saya tidak berpikir kita harus menambahkannya kembali seperti dosis @MuazKhan. Ini adalah alasan mengapa hal-hal menjadi usang dan tidak boleh digunakan lagi. Sebagai gantinya, buat saja fungsi pembantu ... Ini adalah versi yang lebih es6

function stopStream (stream) {
    for (let track of stream.getTracks()) { 
        track.stop()
    }
}
Tak berujung
sumber
1
for (let track of stream.getTracks()) { track.stop() }
tamu271314
7
stream.getTracks().forEach(function (track) { track.stop() })dalam ES5, ini menghindari transformasi babel yang panjang darifor of
fregante
3

Karena Anda memerlukan trek untuk menutup streaming, dan Anda perlu streamboject untuk sampai ke trek, kode yang saya gunakan dengan bantuan jawaban Muaz Khan di atas adalah sebagai berikut:

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();
});

Tentu saja ini akan menutup semua trek video yang aktif. Jika Anda memiliki banyak, Anda harus memilih yang sesuai.

mcy
sumber
2

Anda harus menghentikan semua trek (dari webcam, mikrofon):

localStream.getTracks().forEach(track => track.stop());
Penjual Teratas
sumber
0

Menggunakan .stop () pada streaming berfungsi di chrome saat terhubung melalui http. Tidak berfungsi saat menggunakan ssl (https).

ACEGL
sumber
0

Silakan periksa ini: https://jsfiddle.net/wazb1jks/3/

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

Hentikan rekaman

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
sumber
0

Kode berikut ini berfungsi untuk saya:

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
sumber
0

Mulai dan Hentikan Kamera Web, (Perbarui 2020 Bereaksi es6)

Mulai Kamera Web

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();
        });
      }
 }

Hentikan Kamera Web atau pemutaran Video secara umum

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());
}

Fungsi Stop Web Camera berfungsi bahkan dengan streaming video:

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

Memiliki referensi bentuk keberhasilan stream

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
sumber
1
Jawaban ini pada dasarnya sama dengan beberapa jawaban lain yang telah diberikan.
Dan Dascalescu
Tidak dengan tembakan panjang @DanDascalescu. Lihat, dalam contoh ini dia dengan jelas menunjukkan kemampuannya untuk mengingat fungsi peta.
charliebeck dengan