Остановить веб-камеру потоком getUserMedia без обновления страницы
Я пытаюсь закрыть веб-камеру с помощью функции javascript (она должна быть закрыта после получения некоторого ответа Ajax), но это невозможно закрыть, не обновляя страницу. Все методы для его закрытия как video.src= null, video.pause... и т.д. Вообще не работают в любом браузере. Единственный способ - закрыть поток, переданный как параметр, в функции успеха, так что есть какой-либо способ использовать этот объект за пределами успеха функции, чтобы закрыть веб-камеру?
Я знаю, что этот вопрос задавался раньше (Stop/Close webcam с использованием getUserMedia и RTCPeerConnection Chrome 25), но мои потребности разные, поэтому мне нужно будет немного помочь решить эту проблему
спасибо!
EDIT: мой рабочий код пытается закрыть веб-камеру:
navigator.getUserMedia = navigator.getUserMedia || navigator.mozGetUserMedia || navigator.webkitGetUserMedia || navigator.msGetUserMedia;
if(navigator.getUserMedia){
var video_constraints = {
mandatory: {
maxHeight: 480,
maxWidth: 640
},
optional: []
};
var self = this;
self.navigator.getUserMedia({
audio: false,
video: video_constraints
}, self.onSuccess, onError);
}
else{
alert('An error has occurred starting the webcam stream, please revise the instructions to fix the problem');
}
function onSuccess(stream) {
var video = document.getElementById('webcam');
if(navigator.webkitGetUserMedia || navigator.mozGetUserMedia){
video.src = window.URL.createObjectURL(stream);
}
else if(navigator.msGetUserMedia){
//future implementation over internet explorer
}
else{
video.src = stream;
}
self.localStream = stream;
video.play();
}
function onError() {
alert('There has been a problem retrieving the streams - did you allow access?');
}
function closeWebcamConnection(){
this.localStream.stop();
}
uff.. действительно сложно разместить здесь код XD
Ответы
Ответ 1
Вам нужно остановить объект LocalMediaStream
, выполнив его метод stop()
. У меня были подобные проблемы. Что вам нужно сделать:
Сохраняйте ссылку на LocalMediaStream
в функции обратного вызова onSuccess выполнения getUserMedia()
:
var localStream;
onUserMediaSuccess = function(stream) {
// attach to a video element
...
// keep a reference
localStream = stream;
};
Остановить LocalMediaStream, если необходимо:
localStream.stop();
Дополнительная информация в моей question (и answer).
Ответ 2
Сохранение ссылки на LocalMediaStream
похожее на asgoth подсказки верное, но для меня в Chrome 47. localStream.stop();
дал мне ошибку:
Uncaught TypeError: localStream.stop is not a function
Я получил его для работы, позвонив:
localStream.getVideoTracks()[0].stop();
Ответ 3
Дополнить asgoth answer
localStream.stop() устарел в Chrome 45, удален в Chrome 47
Если u вызывает .stop() из нескольких мест, вы можете использовать следующий вспомогательный элемент для функции остановки, чтобы сохранить логику в одном месте.
var localStream;
onUserMediaSuccess = function(stream) {
// re-add the stop function
if(!stream.stop && stream.getTracks) {
stream.stop = function(){
this.getTracks().forEach(function (track) {
track.stop();
});
};
}
// attach to a video element
...
// keep a reference
localStream = stream;
};
Ответ 4
У меня возникла проблема с закрытием дорожки видеопотока (камера с фронтальной передней панелью) и открытием альтернативной дорожки (камера заднего вида) в Chrome 49. Я обнаружил, что MediaStream.stop()
устарел с версии 45 и был заменен на MediaStreamTrack.stop()
. Вы можете прочитать больше из размещения на сайте разработчика Google Сэмом Даттоном.
Ответ 5
Это, кажется, ошибка в Chrome, и поведение постоянно меняется.
Кажется, это работает, только если вы подключены через http (не https):
var myStream;
function successCallback( stream ) {
...
myStream = stream; // used to close the stream later
}
function closeStream(){
myStream.stop();
myStream = null;
}
По какой-то странной причине это не работает на SSL (https) (проверено на Chrome для Linux, Ver 27 Dev)
Ответ 6
Чтобы избавиться от красного символа на вкладке браузера и для отключения обоих потоков видео и аудио после получения одной из этих ошибок
Uncaught TypeError: localStream.stop is not a function
Uncaught TypeError: _webRTCStream.stop is not a function // TokBox, OpenTok
перебирать найденные дорожки и останавливать их все.
if (_webRTCStream.stop) {
_webRTCStream.stop() // idk what this does, left here for legacy reasons..?
} else {
_webRTCStream.getTracks().forEach(function(track) { track.stop() })
}
note: _webRTCStream
equals localStream
, зависит от библиотеки, которую вы используете.
Ответ 7
if (sourcevid.mozSrcObject) {
sourcevid.mozSrcObject.stop();
sourcevid.src = null;
} else {
sourcevid.src = "";
localStream.stop();
}