Отпустите веб-камеру и микрофон из getUserMedia после обратного отсчета [дубликат]

Как насчет лучшего из обоих миров? Я сочетал ответ с форматом OP.

  function pretty_time_string (num) {return (num & lt; 10? "0": "") + num;  } var start = new Date;  setInterval (function () {var total_seconds = (новая дата - начало) / 1000; var hours = Math.floor (total_seconds / 3600); total_seconds = total_seconds% 3600; var minutes = Math.floor (total_seconds / 60); total_seconds =  total_seconds% 60; var seconds = Math.floor (total_seconds); hours = pretty_time_string (hours); minutes = pretty_time_string (minutes); seconds = pretty_time_string (seconds); var currentTimeString = hours + ":" + minutes + ":" +  секунд, $ ('. timer'). text (currentTimeString);}, 1000);   
73
задан GusP 25 July 2012 в 06:04
поделиться

11 ответов

EDIT

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

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

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

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

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

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

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

93
ответ дан andrei 15 August 2018 в 21:21
поделиться
  • 1
    Я думаю, что stream.stop() не работает для chrome, mediaRecorder.stop() останавливает запись, тогда как это не останавливает поток, предоставляемый браузером. Вы можете посмотреть на это stackoverflow.com/questions/34715357/… – Muthu 11 January 2016 в 08:03
  • 2
    @muthu Спасибо, я обновил ответ. – andrei 11 January 2016 в 21:11
  • 3
    @Muntu, я думаю, это зависит, для меня работает stream.stop () (в хроме). Потому что у меня есть поток webRTC. Итак, если вы записываете в браузере mediaRecorder.stop (), будет работать? – Johan Hoeksma 11 January 2018 в 20:38
  • 4
    да, но это вызывает еще одну проблему. Эта функция для остановки записи должна произойти после разрешения нескольких секунд / минут записи. Как вы можете контролировать это: остановить его после установленного по умолчанию времени записи? Спасибо! – Emanuela Colta 17 July 2018 в 15:53

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

0
ответ дан ACEGL 15 August 2018 в 21:21
поделиться

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

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

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

9
ответ дан Alain Saurat 15 August 2018 в 21:21
поделиться
  • 1
    Это останавливает показ видео в & lt; video & gt; , но не останавливает камеру. – G. Führ 28 December 2015 в 14:08

Имейте ссылку потока от successHandler

var streamRef;

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

//this will stop video and audio both track
streamRef.getTracks().map(function (val) {
    val.stop();
});
-1
ответ дан BigBrother 15 August 2018 в 21:21
поделиться
  • 1
    Этот ответ по существу тот же, что и несколько других, которые уже были даны. – Dan Dascalescu 12 September 2016 в 22:31

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

localMediaStream.stop()

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

7
ответ дан Christian Gollhardt 15 August 2018 в 21:21
поделиться
  • 1
    Понимаю. Я попробую это позже. – Shih-En Chou 20 April 2013 в 04:14
  • 2
    Не совсем ... На firefox не работает. В документах упоминается, что этот метод не реализован во всех браузерах ... – Sdra 28 March 2014 в 18:01
  • 3
    Вышеупомянутое решение не сработало для меня. Так оно и было. – Scottmas 9 November 2014 в 09:56

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

function stopStream (stream) {
    for (let track of stream.getTracks()) { 
        track.stop()
    }
}
4
ответ дан Endless 15 August 2018 в 21:21
поделиться

Попробуйте следующий метод

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
ответ дан imal hasaranga perera 15 August 2018 в 21:21
поделиться

Поскольку вам нужны дорожки, чтобы закрыть потоковое вещание, и вам нужно 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();
});

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

3
ответ дан mcy 15 August 2018 в 21:21
поделиться

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

mediaStream.stop();

// or
mediaStream.getAudioTracks()[0].stop();
mediaStream.getVideoTracks()[0].stop();

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

Вот кросс-браузер 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();
        });
    };
}
46
ответ дан Muaz Khan 15 August 2018 в 21:21
поделиться

FF, Chrome и Opera начали выставлять getUserMedia через navigator.mediaDevices в качестве стандарта сейчас (Might change:)

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

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();
5
ответ дан Sasi Varunan 15 August 2018 в 21:21
поделиться

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

Оповещения MediaStream

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

12
ответ дан sol-ibit 15 August 2018 в 21:21
поделиться
  • 1
    Я благодарен, что это сработало. проверено на chrome v67 – user889030 18 July 2018 в 12:19
Другие вопросы по тегам:

Похожие вопросы: