Как заставить getUserMedia() работать со всеми браузерами
Я узнал о web-rtc, он говорит, что вы можете захватывать видео-камеру,
Я использовал demo, так что это работало только на хром.
когда я открываю его на firefox, я получаю сообщение "getUserMedia() not supported in your browser."
с другой стороны, когда я открою этот HTML5-rock-demo
он работал на 100%.
какие изменения или плагины или что-то, что я пропустил, что позволяет getusermedia()
работать.
Ответы
Ответ 1
Проблема заключается не только в имени префикса функции; поток в разных браузерах работает по-разному. Здесь я проведу вас через это.
Я предполагаю, что вы уже создали элемент видео в переменной под названием video
.
//I don't usually like to overwrite publicly accessible variables, but that just me
var getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
var cameraStream;
getUserMedia.call(navigator, {
video: true,
audio: true //optional
}, function (stream) {
/*
Here where you handle the stream differently. Chrome needs to convert the stream
to an object URL, but Firefox stream already is one.
*/
if (window.webkitURL) {
video.src = window.webkitURL.createObjectURL(stream);
} else {
video.src = stream;
}
//save it for later
cameraStream = stream;
video.play();
});
Это должно охватывать вас для Firefox, Chrome и Opera. IE и Safari еще не поддерживают его.
Еще одна неприятная вещь, о которой нужно знать, - это отключить камеру, если вы хотите прекратить ее использовать, прежде чем покинуть веб-страницу. Используйте эту функцию:
function stopWebCam() {
if (video) {
video.pause();
video.src = '';
video.load();
}
if (cameraStream && cameraStream.stop) {
cameraStream.stop();
}
stream = null;
}
Ответ 2
Fiddles
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
var constraints = {audio: false, video: true};
var video = document.querySelector("video");
function successCallback(stream) {
window.stream = stream; // stream available to console
if (window.URL) {
video.src = window.URL.createObjectURL(stream);
} else {
video.src = stream;
}
}
function errorCallback(error){
console.log("navigator.getUserMedia error: ", error);
}
navigator.getUserMedia(constraints, successCallback, errorCallback);
Ответ 3
Так как Safari 11 отключен, это работает повсюду (тестируется в последних версиях Chrome, Firefox и Safari 11):
var constraints = {audio: false, video: true};
var video = document.querySelector("video");
function successCallback(stream) {
video.srcObject = stream;
video.play();
}
function errorCallback(error) {
console.log("navigator.getUserMedia error: ", error);
}
navigator.mediaDevices.getUserMedia(constraints)
.then(successCallback)
.catch(errorCallback);
Ответ 4
getUserMedia
должен иметь префикс webkit- или moz-. Первый пример только с префиксом webkit-. Поэтому он никогда не будет работать на Firexox, только Chrome и Safari.
В примере кода не отображается префикс...
Префикс может быть выполнен следующим образом:
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;