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



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



есть ли код JavaScript, чтобы остановить или закрыть веб-камеру? Поблагодарить каждого.

904   11  

11 ответов:

EDIT

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

подробнее здесь: https://developers.google.com/web/updates/2015/07/mediastream-deprecations?hl=en#stop-ended-and-active

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

var track = stream.getTracks()[0];  // if only one media track
// ...
track.stop();

поддержка браузера может отличаться.

оригинальный ответ

navigator.getUserMedia предоставляет вам поток в успешном обратном вызове, вы можете позвонить .stop() на этом потоке, чтобы остановить запись (по крайней мере, в Chrome, кажется, FF это не нравится)

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

mediaStream.stop();

// or
mediaStream.getAudioTracks()[0].stop();
mediaStream.getVideoTracks()[0].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.getAudioTracks().forEach(function(track) {
            track.stop();
        });

        this.getVideoTracks().forEach(function(track) {
            track.stop();
        });
    };
}

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

MediaStream Deprecations

использовать stream.getTracks().forEach(track => track.stop())

запуск веб-камеры видео с разных браузеров

Для 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="";

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

вы можете завершить поток непосредственно с помощью объекта stream, возвращенного в обработчике успеха getUserMedia. например,

localMediaStream.stop()

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

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

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

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

попробуйте способ ниже

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

Так как вам нужны треки, чтобы закрыть потоковое, и вам нужно stream boject чтобы добраться до треков, код, который я использовал с помощью ответа Муаз Хана выше, выглядит следующим образом:

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

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

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

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

var streamRef;

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

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

Comments

    Ничего не найдено.