如何让 getUserMedia() 在所有浏览器上工作

IT技术 javascript html html5-video webrtc
2021-03-11 20:05:21

我了解了web-rtc,它说您可以捕获视频摄像头,我使用了演示,这仅适用于 chrome ..

当我在 Firefox 上打开它"getUserMedia() not supported in your browser." 时,当我打开这个HTML5-rocks-demo时,我在另一只手上收到消息

它工作 100%。什么变化或插件或我想念的东西让getusermedia()工作。

6个回答

问题不仅仅是带前缀的函数名;提供的流在不同浏览器中的工作方式不同。在这里,我将带您完成它。

我假设您已经在名为 的变量中设置了一个视频元素video

//I don't usually like to overwrite publicly accessible variables, but that's just me
var getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
var cameraStream;

getUserMedia.call(navigator, {
    video: true,
    audio: true //optional
}, function (stream) {
    /*
    Here's where you handle the stream differently. Chrome needs to convert the stream
    to an object URL, but Firefox's 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;
}
只是对你们所有人的更新,不要使用,video.src = window.webkitURL.createObjectURL(stream); 因为它现在会给你错误,你可以包含这样的直接流,video.src = stream;看看这里了解更多信息stackoverflow.com/a/33759534/6110557
2021-04-21 20:05:21
我在 Chrome 控制台中玩这个,它只有在我为getUserMedia调用提供第三个参数(错误回调)时才有效
2021-04-26 20:05:21
这个答案有任何更新吗?我读到我们现在需要使用navigator.mediaDevices.getUserMedia.
2021-04-27 20:05:21
这是一个图表,显示浏览器对此的支持:caniuse.com/#feat=stream
2021-04-29 20:05:21
@navigator 是的,Firefox 是 navigator.mozGetUserMedia,现在是 navigator.mediaDevices.getUserMedia
2021-05-13 20:05:21

由于 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);
这对我来说navigator.getUserMedia(constraints, successCallback, errorCallback);在 safari失败了。Promise 链也更好。
2021-05-04 20:05:21

小提琴

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);
@RonWertlen 我没有在 safari 上检查它,但它在 chrome 和 firefox 上运行良好,请确保您获得了最新版本的 safari,。
2021-04-22 20:05:21
@RonWertlen Safari 尚不支持它。
2021-04-22 20:05:21
在 Safari 中,所有这三个都是未定义的: navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
2021-05-02 20:05:21

getUserMedia需要以 webkit- 或 moz- 为前缀。第一个示例仅以 webkit- 为前缀。因此它永远不会在 Firexox 上运行,只能在 Chrome 和 Safari 上运行。

代码示例未显示前缀...

前缀可以通过这种方式完成:

navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
您可以检查另一个示例是如何解决它的。(更新的答案)
2021-04-21 20:05:21
我在simpl.info/gum有一个适用于 Firefox、Chrome 和 Opera的示例
2021-04-29 20:05:21

2021 年 1 月 -navigate.getUserMedia已替换为navigate.mediaDevices.getUserMedia