WebRTC - 从 Chrome 而不是 Firefox 获取 'malformed constraints object'

WebRTC - getting 'malformed constraints object' from Chrome but not Firefox

我想知道我做错了什么。

我收到 'malformed constraints object' 个错误:

pc.createAnswer( function (answer) {
  ...
}, fail, { offerToReceiveAudio: true, offerToReceiveVideo: true });

有什么想法吗?

根据最新的Webrtc spec约束参数的正确形式应该是:

{ offerToReceiveAudio: true, offerToReceiveVideo: true }

注意 offerToReceiveAudioofferToReceiveVideo 开头的小写字母“o”。

目前只有 FF 33 或更新版本支持。

Chrome只支持自己的方式:

{ mandatory: { OfferToReceiveAudio: true, OfferToReceiveVideo: true } }

Chrome 如果你给它一个结构符合新规范的约束对象,它会抛出错误。

好消息是 Firefox 仍然接受旧形式。在这种情况下,它只是打印一条警告消息。所以,至少现在,使用旧版本。

我已经为这个问题奋斗了好几个小时,就在刚才我发现了一些有趣的东西:

当我向 Object.prototype 添加任何方法时,我得到 Uncaught TypeError: Failed to construct 'RTCPeerConnection': Malformed constraints object.

示例:

Object.prototype.nothingSpecial = function() {
    console.log("Here goes nothing ...");
};

这会导致异常。

解决方法:删除对Object.prototype.

的any/all修改

我认为这是浏览器中的错误。

-

编辑: 我的同事找出了这个错误的确切原因:

  • enumerable 字段添加到 Object.prototype 时出现错误。
  • 仅添加 non-enumerable 个字段时它有效(例如使用 defineProperty)

-

我正在使用 erizo 视频流媒体库。

测试:JX Browser 6.21(基于 Chromium)
版本:Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如 Gecko)Chrome/64.0.3282.24 Safari/537。 36

完整的错误如下所示:

Uncaught TypeError: Failed to construct 'RTCPeerConnection': Malformed constraints object.
    at Object.Erizo.ChromeStableStack (erizo.js:2405)
    at Object.Erizo.Connection (erizo.js:2910)
    at erizo.js:3670
    at c.<anonymous> (erizo.js:3373)
    at c.onPacket (erizo.js:890)
    at d.onPacket (erizo.js:722)
    at d.c.onPacket (erizo.js:465)
    at d.c.onData (erizo.js:453)
    at WebSocket.websocket.onmessage (erizo.js:929)

第一个异常导致了第二个异常:

Uncaught TypeError: Cannot read property 'processSignalingMessage' of undefined
    at c.<anonymous> (erizo.js:3253)
    at c.emit [as $emit] (erizo.js:213)
    at c.onPacket (erizo.js:887)
    at d.onPacket (erizo.js:722)
    at d.c.onPacket (erizo.js:465)
    at d.c.onData (erizo.js:453)
    at WebSocket.websocket.onmessage (erizo.js:929)

(如果您想知道 erizo.js 文件名和行号:我使用的是印刷精美的 erizo.min.js 版本,以便于调试。)