Я открыл веб-камеру, используя следующий код JavaScript: navigator.getUserMedia
Есть ли какой-либо код JavaScript для остановки или закрытия веб-камеры? Спасибо всем.
Я открыл веб-камеру, используя следующий код JavaScript: navigator.getUserMedia
Есть ли какой-либо код JavaScript для остановки или закрытия веб-камеры? Спасибо всем.
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();
});
Вы можете вызвать " 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();
});
};
}
Не используйте stream.stop()
, он устарел
Используйте 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="";
При этом свет в веб-камера снижается каждый раз...
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();
Вы можете завершить поток напрямую, используя объект потока, возвращенный обработчиком успеха, в getUserMedia. например
localMediaStream.stop()
video.src=""
или null
просто удалит источник из тега видео. Он не выпустит аппаратное обеспечение.
Попробуйте использовать метод
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();
Если .stop()
устарел, тогда я не думаю, что мы должны его повторно добавить, как @MuazKhan. Это причина того, почему вещи устаревают и больше не должны использоваться. Вместо этого создайте вспомогательную функцию... Вот еще версия es6
function stopStream (stream) {
for (let track of stream.getTracks()) {
track.stop()
}
}
Поскольку вам нужны дорожки, чтобы закрыть потоковое вещание, и вам нужен 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();
});
Конечно, это закроет все активные видеодорожки. Если у вас несколько, вы должны выбрать соответственно.
Предположим, у нас есть потоковая передача в теге 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;
Вам нужно остановить все треки (с веб-камеры, микрофона):
localStream.getTracks().forEach(track => track.stop());
Использование .stop() в потоке работает на chrome при подключении через http. Это не работает при использовании ssl (https).
Пожалуйста, проверьте это: https://jsfiddle.net/wazb1jks/3/
navigator.getUserMedia(mediaConstraints, function(stream) {
window.streamReference = stream;
}, onMediaError);
Следующий код работал для меня:
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();
}
localStream.getTracks().forEach(track => track.stop());
правильно... но и правильно, когда использование https что-то не работает.
blob: https://stackoverflow.com/cb1a629f-20d8-4702-9eb2-b6e57f20cf80
https://i.stack.imgur.com/ucW2h.jpg введите описание изображения здесь
У вас есть ссылка на форму потока successHandle
var streamRef;
var handleVideo = function (stream) {
streamRef = stream;
}
//this will stop video and audio both track
streamRef.getTracks().map(function (val) {
val.stop();
});