Navigator.getUserMedia tarafından açılan web kamerasını Durdur / Kapat


139

Aşağıdaki JavaScript kodunu kullanarak bir web kamerası açtım: navigator.getUserMedia

Web kamerasını durdurmak veya kapatmak için herhangi bir JavaScript kodu var mı? Herkese teşekkürler.

Yanıtlar:


199

DÜZENLE

Bu yanıt ilk olarak gönderildiğinden tarayıcı API'si değişti. .stop()artık geri aramaya aktarılan akışta kullanılamıyor. Geliştiricinin akışı oluşturan parçalara (ses veya video) erişmesi ve her birini ayrı ayrı durdurması gerekir.

Daha fazla bilgi burada: https://developers.google.com/web/updates/2015/07/mediastream-deprecations?hl=tr#stop-ended-and-active

Örnek (yukarıdaki bağlantıdan):

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

Tarayıcı desteği farklı olabilir.

Orijinal cevap

navigator.getUserMediabaşarılı geri aramada bir .stop()akış sağlarsa, kaydı durdurmak için bu akışı çağırabilirsiniz (en azından Chrome'da, FF hoşuna gitmiyor gibi görünüyor)


2
Bence stream.stop()krom mediaRecorder.stop()için çalışmaz, kaydı durdurur, oysa tarayıcı tarafından sağlanan akışı durdurmaz. Bu stackoverflow.com/questions/34715357/…
Muthu

@Muntu, bence bağlıdır, benim için stream.stop () çalışıyor (kromda). Çünkü bir webRTC akışım var. Yani tarayıcıda kayıt yapıyorsanız mediaRecorder.stop () çalışır mı?
Johan Hoeksma

evet, ama bu başka bir konuyu gündeme getiriyor. Kaydı durdurmak için bu fonksiyon, birkaç saniye / dakika kayda izin verildikten sonra yapılmalıdır. Bunu nasıl kontrol edebilirsiniz: varsayılan kayıt süresinden sonra durdurmak için? Teşekkür ederim!
Emanuela Colta

1
Bu, akışları durdurur, ancak krom üzerindeki video göstergesi yeniden yükleninceye kadar etkin kalır. Bunu da kaldırmanın bir yolu var mı?
Cybersupernova

@Cybersupernova Bunun için bir çözüm buldunuz mu? Sayfa yenilemenin işe yarayacağını düşünüyorum
samayo

59

Bu işlevlerden herhangi birini kullanın:

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

Not: Cevap şu tarihte güncellendi: 06/09/2020


2
Bunun için teşekkürler. mediaStream.stop kullanımdan kaldırılıyor.
Dan Brown

@DanBrown çözümünüz nedir?
Webwoman

Resmi olarak kullanımdan kaldırılan ve tarayıcıdan kaldırılan bir özelliği geri yüklemek için yerel bir API'nın prototipini değiştirmeyi kesinlikle önermem . Düzensiz ve daha sonra karışıklığa neden olması muhtemel. Bir akıştaki tüm parçaları durdurmanız gerektiğinde, neden sadece değil stream.getTracks().forEach(track => { track.stop() })? Veya bunu bir stenografı haklı çıkaracak kadar sık ​​sık yapıyorsanız, her zaman gibi bir yardımcı işlev tanımlayabilirsiniz stopAllTracks(stream).
callum

45

Kullanmayın stream.stop(), kullanımdan kaldırıldı

MediaStream Kullanımdan Kaldırılma

kullanım stream.getTracks().forEach(track => track.stop())


1
Çok teşekkür ederim ,, tamamen iyi çalışıyor, amortisman nedeniyle çalışan bir insan kafa karıştırıcı ama Mart-2019 itibariyle yukarıdaki çözüm kromda iyi çalışıyor .. 🙂
PANKAJ NAROLA

10

FF, Krom ve Opera açığa başlamıştır getUserMediayoluyla navigator.mediaDevices(değiştirmek Olabilir şimdi standart olarak :)

çevrimiçi 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();

9

Web Kamerası Video'sunu farklı tarayıcılarla başlatma

Opera 12 için

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

Firefox Nightly 18.0 için

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

Chrome 22 için

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

Web Kamerası Video'sunu farklı tarayıcılarla durdurma

Opera 12 için

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

Firefox Nightly 18.0 için

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

Chrome 22 için

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

Bu web kamerası ışığı her zaman aşağı inmek ...


10
Bu yalnızca videonun <video> etiketinde gösterilmesini durdurur, ancak kamerayı durdurmaz.
G. Führ

8

Video etiketinde akışımız olduğunu ve id'nin video olduğunu varsayalım - <video id="video"></video>o zaman aşağıdaki kodu almalıyız -

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;

6

GetUserMedia için başarı işleyicisinde döndürülen akış nesnesini kullanarak akışı doğrudan sonlandırabilirsiniz. Örneğin

localMediaStream.stop()

video.src=""veya nullkaynağı video etiketinden kaldırabilir. Donanımı serbest bırakmayacak.


Anlıyorum. Daha sonra deneyeceğim.
Shih-En Chou

1
Pek değil ... Firefox'ta çalışmıyor. Dokümanlar, bu yöntemin tüm tarayıcılarda uygulanmadığını
belirtiyor

Yukarıdaki çözüm benim için işe yaramadı. Bunu başardı.
Kasım'da Scottmas

5

Aşağıdaki yöntemi deneyin:

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

4

Eğer .stop()kullanımdan kaldırıldı o zaman biz @MuazKhan doz gibi yeniden ekleyin gerektiğini sanmıyorum. Bu, neden kullanımdan kaldırıldıklarının ve artık kullanılmamalarının bir nedeni. Bunun yerine bir yardımcı işlev oluşturun ... İşte daha fazla es6 sürümü

function stopStream (stream) {
    for (let track of stream.getTracks()) { 
        track.stop()
    }
}

1
for (let track of stream.getTracks()) { track.stop() }
guest271314

7
stream.getTracks().forEach(function (track) { track.stop() })ES5'te, bu uzun babel dönüşümlerinifor of
fregante

3

streamAkışı kapatmak için parçalara ihtiyacınız olduğundan ve parçalara ulaşmak için botasyona ihtiyacınız olduğundan , Muaz Khan'ın yukarıdaki cevabının yardımıyla kullandığım kod aşağıdaki gibidir:

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

Elbette bu, tüm aktif video parçalarını kapatacaktır. Birden fazla varsa, buna göre seçim yapmalısınız.


2

Tüm parçaları durdurmanız gerekir (web kamerasından, mikrofondan):

localStream.getTracks().forEach(track => track.stop());

0

Akışta .stop () kullanılması, http üzerinden bağlandığında krom üzerinde çalışır. SSL (https) kullanılırken çalışmaz.


0

Lütfen bunu kontrol edin: https://jsfiddle.net/wazb1jks/3/

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

Kaydetmeyi bırak

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


0

Aşağıdaki kod benim için çalıştı:

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

0

Web Kamerasını Başlat ve Durdur, (2020 React es6 Güncellemesi)

Web Kamerasını Başlat

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

Genel olarak Web Kamerası veya Video oynatmayı durdurma

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

Web Kamerasını Durdur işlevi video akışlarında bile çalışır:

  this.video.src = this.state.videoToTest;
  this.video.play();

-1

Başarılı bir akış formu referansı var

var streamRef;

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

//this will stop video and audio both track
streamRef.getTracks().map(function (val) {
    val.stop();
});

1
Bu cevap aslında daha önce verilmiş olan diğerleriyle aynıdır.
Dan Dascalescu

@DanDascalescu tarafından uzun bir atışla değil. Bakın, bu örnekte harita fonksiyonunu hatırlama yeteneğini açıkça göstermektedir.
charliebeckwith
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.