2013-04-10 3 views
13

Я пытаюсь закрыть веб-камеру с помощью функции javascript (она должна быть закрыта после получения некоторого ответа Ajax), но это невозможно закрыть, не обновляя страницу. Все методы для его закрытия как video.src = null, video.pause ... и т. Д. Вообще не работают в любом браузере. Единственный способ - закрыть поток, переданный как параметр, в функции успеха, так что есть какой-либо способ использовать этот объект вне функции, чтобы закрыть веб-камеру?остановить потоковое воспроизведение веб-камеры getUserMedia без обновления страницы

Я знаю, что этот вопрос был задан до (Stop/Close webcam using getUserMedia and 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..it действительно сложно размещать сюда код XD

ответ

28

Вы должны остановить LocalMediaStream объект, выполнив свой метод stop() , У меня были подобные проблемы. Что вам нужно сделать, это:

Держите ссылку на LocalMediaStream в OnSuccess функцию обратного вызова getUserMedia() исполнения:

var localStream; 

onUserMediaSuccess = function(stream) { 
    // attach to a video element 
    ... 
    // keep a reference 
    localStream = stream; 
}; 

Остановить LocalMediaStream, где это необходимо:

localStream.stop(); 

Более подробную информацию в мой собственный questionanswer).

+0

Mmmm ok, я попытался поместить что-то подобное в свой код, но я не знаю, потому что ваш код совершенно другой. Я также видел твою старую проблему, но мне все еще сложно понять. Почему вы сохраняете объект потока в объекте «self», если вы используете «this» для остановки потока? Я буду размещать здесь свой код, таким образом, возможно, вы можете сказать мне, как реализовать свое решение: – user2158954

+0

Я допускаю использование «я», возможно, путаясь без всего контекста. Я немного адаптировал свой ответ. Просто сохраните ссылку в глобальной или ограниченной переменной localStream. – asgoth

+0

невероятный! Я только что протестировал в Chrome и Firefox и ... отлично работает !! Теперь, когда я помню, я тоже пытался что-то подобное, но это не сработало. Теперь было бы идеально, если бы я мог отправить захват изображения холста в качестве запроса без использования утомительного ajax, но это еще одна тема jej. Большое спасибо! Единственное, что можно сделать, можно использовать с HTTPS? – user2158954

0

Это, по-видимому, багги в 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)

+0

Извините, но ваш метод не работает для меня. Я думаю, что некоторое время назад я видел нечто подобное, но это тоже не сработало. Я пробовал как Chrome, так и Firefox в последних версиях. Кроме того, мне нужно будет реализовать с HTTPS. – user2158954

+0

Я только тестировал его на Chrome 27 dev на Linux. Какая у вас настройка? Если вам нужен HTTPS (как и я), он все равно не сделает для вас. Я открыл проблему в трекер WebRTC. [link] (https://code.google.com/p/webrtc/issues/detail?id=1622) – ACEGL

+0

oh shit XD! Мое приложение должно работать через HTTPS. Я использую Windows 7 64 бит, Enterprise edition. Мое веб-приложение работает в Eclipse Java EE IDE для веб-разработчиков, версия Indigo Service Release 2. Я тестировал Firefox 19.0.2 и Chrome 26.0.1410.43. Он также работает в Opera 12.15. Умм, для меня не проблема, если бы я мог использовать функции request.getParameter из сервлета, чтобы взять изображение холста в формате dataURL. Я не нашел способ сделать это, возможно, это невозможно. Вы попробовали что-то подобное? – user2158954

-1
if (sourcevid.mozSrcObject) { 
    sourcevid.mozSrcObject.stop(); 
    sourcevid.src = null; 
} else { 
    sourcevid.src = ""; 
    localStream.stop(); 
} 
32

Сохранение ссылки на LocalMediaStream как asgoth наводит на мысль правильна, но для меня в Chrome 47. localStream.stop(); дал мне ошибку:

Uncaught TypeError: localStream.stop is not a function 

Я получил его на работу по телефону:

localStream.getVideoTracks()[0].stop(); 
+6

В настоящее время (по состоянию на декабрь 2015 года) это важный ответ. У нас была эта проблема в веб-приложении, в результате чего вкладка в Chrome обрушилась сообщением «Aw, snap». Это решило проблему для нас. –

+0

Это связано с ошибкой TokBox/OpenTok '_webRTCStream.stop() не является функцией'. – Qwerty

+1

Все еще не останавливается на этом методе. Есть даже функция removeTrack, которую вы можете использовать для удаления всех дорожек, но мой свет веб-камеры все еще включен. – Dtipson

0

Чтобы избавиться от красного символа на вкладке браузера и для отключения обоих, VIdeo и Audio потоки по получать один из этих ошибок

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

примечание: _webRTCStream равно localStream, зависит от библиотеки, которую вы используете.

8

Дополнение к asgoth's answer

localStream.stop() is deprecated in Chrome 45, removed in Chrome 47

Если и называть .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; 
}; 
1

У меня была проблема, закрывая видеопотока дорожки (фронтальная камера) и открывая альтернативный трек (задний перед камерой) в Chrome 49. Я обнаружил, что MediaStream.stop() является устаревшим, начиная с версии 45, и был заменен на MediaStreamTrack.stop(). Вы можете прочитать больше от posting на сайте разработчика Google Сэмом Даттоном.

 Смежные вопросы

  • Нет связанных вопросов^_^