2015-10-07 72 views
2

我使用(https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia)下面的代码:与getUserMedia火狐V41问题没有看到Chrome或Firefox V36

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 
[email protected]://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都已定义。

我不知道如何解决这个问题,而不会破坏其中一个浏览器。有任何想法吗?

回答

1

如果您将您的语句包围在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; 
} 
+0

这是一个有点hokey,但它的作品。感谢Cory! – JulieMarie

+2

这段代码覆盖了拥有它的浏览器的原生'navigator.mediaDevices.getUserMedia'功能,这并不是很好。另外,请注意,“navigator.mediaDevices.getUserMedia”无法在Chrome中运行,正如https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia中所述。您应该使用[adapter.js](https://github.com/webrtc/adapter/blob/master/adapter.js)。 – jib

2

您复制的代码(我写顺带)做了糟糕的工作试图填充工具navigator.mediaDevices.getUserMedia到没有它本身还没有浏览器。它已从您找到它的地方移除。感谢您发现它已损坏。

填充是棘手的业务,所以我强烈建议使用官方WebRTC填充的adapter.js,而不是试图手动填充它。您可以直接使用最新版本adapter.js的,或者链接到最新总是一个,像这样:

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

的是,在你所提到的浏览器上运行的这样的一个例子见https://jsfiddle.net/srn9db4h/

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

这也是不够的,因为getUserMedia的位置不是the specification已更改的唯一的东西。的约束格式参数has changed as well,这就是为什么navigator.mediaDevices.getUsermedia仍处于实验阶段国旗后在Chrome 45

adapter.js照顾的这一切,直到浏览器赶上。

+0

甜美!谢谢@jib!它的工作,直到我们在Firefox v41上尝试它!我一定会考虑adapter.js。试图根据我们的需求来处理WebRTC,这让我在Firefox中头疼! – JulieMarie

+0

我同意当API改变时令人沮丧。具有讽刺意味的是,Firefox比Chrome更接近API的规范[此时](http://iswebrtcreadyyet.com/)。 adapter.js由Google维护,并且是一个很好的权宜之计。 Media Capture和Streams规范终于稳定下来,但PeerConnection规范仍在进行最后一刻的更改,因此对于生产,您可能想要对最新的adapter.js进行快照,而不是链接到可能随规范更改而更改的最新规范。 – jib

+0

我将不得不阅读更多的规格。当音频/视频的许可请求在FF中完成并且您解散时,没有任何通知。这是什么规格?至少Chrome会回应,并让您知道请求已被解雇! – JulieMarie