在Chrome或Firefox v36中看不到getUserMedia的Firefox v41问题

在Chrome或Firefox v36中看不到getUserMedia的Firefox v41问题,firefox,getusermedia,Firefox,Getusermedia,我使用()中的以下代码: 设置麦克风以供使用。这在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.mozGetUserMe

我使用()中的以下代码:

设置麦克风以供使用。这在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

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

如果你把你的陈述放在一个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;
}
您复制的代码(我附带编写的)在尝试将
navigator.mediaDevices.getUserMedia
聚合到本机还没有它的浏览器中时做得很糟糕。它已经从你找到它的地方移走了。谢谢你发现它坏了

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

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

有关在您提到的浏览器中工作的示例,请参见

我不会试图更正您提到的代码,因为polyfilling
navigator.mediaDevices
正确地说变得相当复杂

这也是不够的,因为
getUserMedia
的位置并不是唯一发生变化的地方。constraints参数的格式,这就是为什么
navigator.mediaDevices.getUsermedia
仍在Chrome45中的实验标志后面


这段代码覆盖了浏览器上的原生
navigator.mediaDevices.getUserMedia
函数,这并不好。另外,请注意,
navigator.mediaDevices.getUserMedia
不能在Chrome中正常工作,正如本文中所述。你应该改用。甜心!谢谢@jib!在我们在FirefoxV41上试用之前,它一直有效!我一定会研究adapter.js。在Firefox中,试图控制WebRTC以满足我们的需求让我头疼!我同意当API改变时是令人沮丧的。具有讽刺意味的是,Firefox比Chrome更接近API规范。不过,adapter.js由Google维护,是一个很好的权宜之计。Media Capture and Streams规范终于稳定了,但PeerConnection规范仍在进行最后一分钟的更改,因此在生产过程中,您可能希望快照最新的adapter.js,而不是链接到最新的adapter.js,后者可能会随着规范的更改而更改。我必须进一步阅读规范。当音频/视频的权限请求在FF中发出,并且您将其驳回时,不会发出任何通知。那是规格吗?至少Chrome会回复并让您知道请求已被驳回!我打赌它仍然存在,在URL栏中最小化。请参阅和相关问题。该规范将权限模型留给浏览器。Chrome有不同的权衡。我猜你说的是灰色麦克风吧?是的,好吧,我知道这一点,通过提醒我,我刚刚发现了我的逻辑的另一个缺陷!我在口香糖显示后立即弹出一个窗口,要求用户“始终共享”,但如果他们出于任何原因将口香糖x’s掉,用户将丢失!谢谢你给我指出你发布的bug…我经常浏览这些bug。我只希望FF能像Chrome一样返回“PermissionDeniedError”和“PermissionDismissedError”。
<script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>