Остановить/закрыть веб-камеру, которая открывается navigator.getUserMedia

Я открыл веб-камеру, используя следующий код JavaScript: navigator.getUserMedia

Есть ли какой-либо код JavaScript для остановки или закрытия веб-камеры? Спасибо всем.

Ответ 1

EDIT

Поскольку этот ответ был первоначально опубликован, API браузера изменился. .stop() больше не доступен в потоке, который передается обратному вызову. Разработчик должен будет получить доступ к дорожкам, которые составляют поток (аудио или видео), и остановить каждую из них в отдельности.

Больше информации здесь: https://developers.google.com/web/updates/2015/07/mediastream-deprecations?hl=en#stop-ended-and-active

Пример (по ссылке выше):

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

Ответ 2

Вы можете вызвать " stop " над объектом MediaStream, который будет устаревшим; новое предложение - выпустить медиа-треки, вызвав " стоп " по каждому медиа-треку:

mediaStream.stop();

// or
mediaStream.getTracks()[0].stop();
mediaStream.getTracks()[1].stop();

Обновлено 03 ноя 2015 г. ---- 10:34:24

Вот кросс-браузер stream.stop hack:

var MediaStream = window.MediaStream;

if (typeof MediaStream === 'undefined' && typeof webkitMediaStream !== 'undefined') {
    MediaStream = webkitMediaStream;
}

/*global MediaStream:true */
if (typeof MediaStream !== 'undefined' && !('stop' in MediaStream.prototype)) {
    MediaStream.prototype.stop = function() {
        this.getTracks().forEach(function(track) {
            track.stop();
        });
    };
}

Ответ 3

Не используйте stream.stop(), он устарел

Недостатки MediaStream

Используйте stream.getTracks().forEach(track => track.stop())

Ответ 4

Запуск веб-камеры с различными браузерами

Для Opera 12

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

Для Firefox Nightly 18.0

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

Для Chrome 22

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

Остановка видео в веб-камерах с различными браузерами

Для Opera 12

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

Для Firefox Nightly 18.0

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

Для Chrome 22

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

При этом свет в веб-камера снижается каждый раз...

Ответ 5

FF, Chrome и Opera начали getUserMedia через navigator.mediaDevices качестве стандарта сейчас (возможно, изменение :)

онлайн-демонстрация

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 audio 
localStream.getVideoTracks()[0].stop();

Ответ 6

Вы можете завершить поток напрямую, используя объект потока, возвращенный обработчиком успеха, в getUserMedia. например

localMediaStream.stop()

video.src="" или null просто удалит источник из тега видео. Он не выпустит аппаратное обеспечение.

Ответ 7

Попробуйте использовать метод

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

Ответ 8

Если .stop() устарел, тогда я не думаю, что мы должны его повторно добавить, как @MuazKhan. Это причина того, почему вещи устаревают и больше не должны использоваться. Вместо этого создайте вспомогательную функцию... Вот еще версия es6

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

Ответ 9

Поскольку вам нужны дорожки, чтобы закрыть потоковое вещание, и вам нужен stream boject для перехода к трекам, код, который я использовал с помощью ответа Muaz Khan, выглядит следующим образом:

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

Конечно, это закроет все активные видеодорожки. Если у вас несколько, вы должны выбрать соответственно.

Ответ 10

Предположим, у нас есть потоковая передача в теге video, а id - это video - <video id="video"></video> тогда у нас должен быть следующий код -

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

//присваиваем нуль для srcObject видео videoEl.srcObject = null;

Ответ 11

Вам нужно остановить все треки (с веб-камеры, микрофона):

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

Ответ 12

Использование .stop() в потоке работает на chrome при подключении через http. Это не работает при использовании ssl (https).

Ответ 13

Пожалуйста, проверьте это: https://jsfiddle.net/wazb1jks/3/

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

Ответ 14

Следующий код работал для меня:

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

Ответ 15

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

правильно... но и правильно, когда использование https что-то не работает.

Ответ 17

У вас есть ссылка на форму потока successHandle

var streamRef;

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

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