【问题标题】:Firefox v41 issue with getUserMedia not see in Chrome or Firefox v36在 Chrome 或 Firefox v36 中看不到 getUserMedia 的 Firefox v41 问题
【发布时间】:2015-10-07 00:52:44
【问题描述】:

我使用来自 (https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia) 的以下代码:

navigator.mediaDevices = navigator.mediaDevices || ((navigator.mozGetUserMedia || navigator.webkitGetUserMedia) ? {
   getUserMedia: function(c) {
     return new Promise(function(y, n) {
       (navigator.mozGetUserMedia || navigator.webkitGetUserMedia).call(navigator, c, y, n);
     });
   }
} : null);

设置麦克风以供使用。这在 Chrome (v45) 和 Firefox (v36) 中效果很好,但在 Firefox (v41) 中我在控制台中收到以下错误:

Error: setting a property that has only a getter
RecorderSvc.initAudio@http://fakewebsite.com/js/services/recorder.js:61:1

我可以通过以下方式解决问题:

if (navigator.mozGetUserMedia || navigator.webkitGetUserMedia) {
    navigator.mediaDevices.getUserMedia = function(c) {
        return new Promise(function(y, n) {
            (navigator.mozGetUserMedia || navigator.webkitGetUserMedia).call(navigator, c, y, n);
        });
    }
}

但这在 Chrome 或 Firefox (v36) 中不起作用。

  • 在 Chrome 中,仅定义了 navigator.webkitGetUserMedia。
  • 在 Firefox (v36) 中,仅定义了 navigator.mozGetUserMedia。
  • 在 Firefox (v41) 中,navigator.mozGetUserMedia 和 navigator.mediaDevices 已定义。

我不知道如何在不破坏其中一个浏览器的情况下解决此问题。有什么想法吗?

【问题讨论】:

    标签: firefox getusermedia


    【解决方案1】:

    您复制的代码(我偶然写的)做得很糟糕,试图将navigator.mediaDevices.getUserMedia 填充到本机还没有它的浏览器中。它已从您找到它的地方删除。感谢您发现它已损坏。

    Polyfilling 是一项棘手的工作,因此我强烈建议您使用官方 WebRTC polyfill adapter.js,而不是尝试手动填充它。您可以使用最新版本的 adapter.js,或直接链接到最新版本,如下所示:

    <script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>
    

    请参阅https://jsfiddle.net/srn9db4h/,了解适用于您提到的浏览器的示例。

    我不会尝试更正您提到的代码,因为正确填充 navigator.mediaDevices 变得相当复杂。

    这也是不够的,因为getUserMedia 的位置并不是the specification 中唯一改变的东西。 constraints 参数 has changed as well 的格式,这就是为什么 navigator.mediaDevices.getUsermedia 在 Chrome 45 中仍然落后于实验标志。

    adapter.js 负责所有这些,直到浏览器赶上来。

    【讨论】:

    • 甜蜜!谢谢@jib!它一直有效,直到我们在 Firefox v41 上试用它!我一定会研究 adapter.js。试图通过 WebRTC 来满足我们的需求让我在 Firefox 中头疼!
    • 我同意当 API 发生变化时会令人沮丧。具有讽刺意味的是,Firefox 比 Chrome 更接近 API at this moment 的规范。不过,adapter.js 由 Google 维护,是一个很好的权宜之计。 Media Capture and Streams 规范终于稳定了,但 PeerConnection 规范仍在进行最后一刻的更改,因此对于生产,您可能希望对最新的 adapter.js 进行快照,而不是链接到可能随规范更改而更改的最新版本。
    • 我将不得不进一步阅读规范。当在 FF 中提出音频/视频的权限请求并且您将其关闭时,没有任何通知。是那个规格吗?至少 Chrome 会响应并通知您请求已被驳回!
    • 我敢打赌它还在,在 URL 栏中最小化。请参阅bugzil.la/1004055 和相关问题。该规范将权限模型留给浏览器。 Chrome 有不同的权衡。
    • 我猜你说的是灰色麦克风?是的,好吧,我知道这一点,通过提醒我,我发现了我的逻辑的另一个缺陷!我在显示 gUM 后立即弹出一个窗口,要求用户“始终共享”,但如果他们出于任何原因通过 x'ing 将 gUM 解散,用户将丢失!感谢您指出您发布的错误...我经常查看错误。我只是希望 FF 能像 Chrome 一样返回“PermissionDeniedError”和“PermissionDismissedError”。
    【解决方案2】:

    如果您将语句包含在 Try Catch 块中,它将起作用。

    if (navigator.mediaDevices || (navigator.mozGetUserMedia || navigator.webkitGetUserMedia)) {
      try {
        navigator.mediaDevices = {
          getUserMedia: function(c) {
            return new Promise(function(y, n) {
              (navigator.mozGetUserMedia || navigator.webkitGetUserMedia).call(navigator, c, y, n);
            });
          }
        };
      }
      catch(err) {
        navigator.mediaDevices.getUserMedia = function(c) {
          return new Promise(function(y, n) {
            (navigator.mozGetUserMedia || navigator.webkitGetUserMedia).call(navigator, c, y, n);
          });
        }
      }
    } else {
      navigator.mediaDevices = null;
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多