【问题标题】:Firefox WebRTC signaling DOMException Failed to parse SDPFirefox WebRTC 发出 DOMException 无法解析 SDP
【发布时间】:2019-01-31 18:14:21
【问题描述】:

我在 HTML5 游戏中使用 WebRTC 数据通道进行联网。 虽然 WebRTC 可以用于 P2P,但该项目的拓扑结构是集中的客户端-服务器。服务器是一个充当 WebRTC 对等点的 Node.js 进程。客户端是与服务器建立 1-1 连接的浏览器。

我正在使用simple-peer 库来处理客户端和服务器上的 WebRTC。在 Node.js 服务器上,我使用 wrtc 模块作为对等连接实例。 对于信令握手,我在客户端和服务器上都使用signalhub

以下是一些演示如何设置握手的假代码

//client
var peer = new SimplePeer({initiator: true});
peer.on('signal', (signalPayload) => signalHub.broadcast('client_signal', signalPayload));
signalHub.subscribe('server_signal', function(signalPayload){ peer.signal(signalPayload) });

//server
signalHub.subscribe('client_signal', (signalPayload) => {
    peer = new Simplepeer({});
    peer.signal(signalPayload);

    peer.on('signal', (signalPayload) => signalHub.broadcast('server_signal', signalPayload));
})

当前设置在 Chrome 中始终按预期工作...

Firefox 无法建立连接。 Simple-peer 的错误处理程序抛出错误 peer.on('error', (err) => {})

DOMException: "Failed to parse SDP: SDP Parse Error on line 6: No webrtc-datachannel token in m= media line, parse failed.

触发此错误的具体信号载荷如下:

v=0
o=- 1575807233894551963 2 IN IP4 127.0.0.1
s=-
t=0 0
a=msid-semantic: WMS
m=application 0 UDP/DTLS/SCTP 5000
c=IN IP4 0.0.0.0
a=mid:0
a=sctpmap:5000 webrtc-datachannel 1024

这是服务器发送给客户端的有效负载,它是“应答”有效负载。

以下是 Chrome 与 Firefox offeranswer 有效载荷的完整比较

  • Chrome 提供给 Node.js
{
type: "offer",
sdp:
"v=0
o=- 5121147169778109884 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE data
a=msid-semantic: WMS
m=application 9 DTLS/SCTP 5000
c=IN IP4 0.0.0.0
a=ice-ufrag:CmIA
a=ice-pwd:jHCWR4JJquU/r8KXtP0cQ9YN
a=ice-options:trickle
a=fingerprint:sha-256 0C:AC:DB:40:8E:AD:58:D8:09:3B:66:94:63:1B:00:D0:09:BD:F3:72:BF:29:66:53:94:9B:67:22:A9:27:A0:35
a=setup:actpass
a=mid:data
a=sctpmap:5000 webrtc-datachannel 1024
"
}
  • Firefox 提供给 Node.js
{
 type: "offer",
sdp:
"v=0
o=mozilla...THIS_IS_SDPARTA-64.0.2 6450781105440687594 0 IN IP4 0.0.0.0
s=-
t=0 0
a=sendrecv
a=fingerprint:sha-256 54:5D:CF:E6:B6:B5:9B:60:C3:AB:F3:EC:5A:62:18:5E:13:F2:1A:23:86:03:BA:9D:D0:EA:67:7B:1C:5C:0A:2A\r\na=group:BUNDLE 0\r\na=ice-options:trickle
a=msid-semantic:WMS *
m=application 9 UDP/DTLS/SCTP webrtc-datachannel
c=IN IP4 0.0.0.0
a=sendrecv
a=ice-pwd:c2217ee835bac1bdc0a765ebf1b5de2c
a=ice-ufrag:b0ceda3e
a=mid:0
a=setup:actpass
a=sctp-port:5000
a=max-message-size:1073741823"
}
  • Node.js 响应 Chrome 报价
"v=0
o=- 4547471447226747141 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE data
a=msid-semantic: WMS
m=application 62951 DTLS/SCTP 5000
c=IN IP4 192.168.1.159
b=AS:30
a=candidate:105744546 1 udp 2122260223 192.168.1.159 62951 typ host generation 0 network-id 1 network-cost 50
a=ice-ufrag:taPA
a=ice-pwd:Q/W3D4wgrRqMrfVT51yO3i5T
a=fingerprint:sha-256 2A:3C:A3:64:92:7D:32:F5:AB:5F:69:1F:C1:76:82:4C:97:A3:FE:CA:70:C5:E3:FA:FC:C0:11:FC:E3:DB:D5:1C
a=setup:active
a=mid:data
a=sctpmap:5000 webrtc-datachannel 1024"
  • Node.js 响应 Firefox 报价
"v=0
o=- 1575807233894551963 2 IN IP4 127.0.0.1
s=-
t=0 0
a=msid-semantic: WMS
m=application 0 UDP/DTLS/SCTP 5000
c=IN IP4 0.0.0.0
a=mid:0
a=sctpmap:5000 webrtc-datachannel 1024"

我们可以看到 Firefox 应答负载看起来很奇怪。它缺少fingerprint 和其他a= 字段。此外,它确实包含 m= 字段,这很奇怪,然后它会抛出 DOMException 声称无法解析。

【问题讨论】:

  • 上面列出的“Firefox 答案”不能是 Firefox 的答案,因为 o 行不包含“mozilla...THIS_IS_SDPARTA”。
  • @NilsOhlmeier 它是在 Node.js 服务器上使用 wrtc 模块响应 FireFox offer 生成的答案。

标签: javascript firefox networking webrtc


【解决方案1】:

非浏览器端点不支持 v21 SCTP 报价,给出格式错误的答案

看起来您服务器上的 webrtc 代码(您设置中的远程端点)不支持 Firefox 提供的较新的 m=application 格式,并且在这种情况下会产生不正确的答案,导致 Firefox 窒息,正如 Firefox 期望以新格式对其新格式提供的答案:

  • Firefox 优惠:
m=application 9 UDP/DTLS/SCTP webrtc-datachannel
a=sctp-port:5000

Firefox(63 岁以上)从 2017 年开始使用更新的 version 21+ of the SCTP SDP draft

Chrome 从 2013 年开始使用旧的 version 05 of the SCTP SDP draft

  • Chrome 优惠:
m=application 9 DTLS/SCTP 5000
a=sctpmap:5000 webrtc-datachannel 1024

不幸的是,这是一个突破性的变化。旧解析器期望在 m 行中找到一个数字 (5000),而新解析器期望在该处找到 webrtc-datachannel。阅读更多关于它的信息here

当 Firefox 是回答者时,它会同时响应(旧的回答对旧的提议,新的回答对新的提议),太棒了!但是,当 Firefox 是提供者时(这里就是这种情况),它会发出一个新的报价并期望一个新的答案作为回报(Chrome,顺便说一句,知道如何回答新的报价,即使它自己还没有发出它们)。

解决方法

理想情况下,您需要更新服务器以发出正确答案。取而代之的是,如果您将 Firefox 设为应答器,它应该可以工作。

如果这不是一个选项,它可能会在两种格式之间调整 SDP:您需要在服务器看到之前将 Firefox 的报价更改为旧格式,并在设置之前将其回复为新格式在 Firefox 中使用 setRemoteDescription

【讨论】:

    【解决方案2】:

    根据问题下方的评论,我认为现在很明显wrtc Node 模块不理解新版本 Firefox 使用的新 SCTP SDP 格式。 wrtc 模块需要修复和更新。

    我看到你已经打开了https://github.com/node-webrtc/node-webrtc/issues/483。我认为这是解决这个问题的方法。

    【讨论】:

      【解决方案3】:

      从 Chrome 获得这样一个答案的唯一方法是,如果您像这样使用它的专有 rtp 数据通道:

      var pc = new RTCPeerConnection(null, {optional: [{RtpDataChannels: true}]});
      pc.setRemoteDescription({type: 'offer', sdp: 'v=0\no=mozilla...THIS_IS_SDPARTA-64.0.2 6450781105440687594 0 IN IP4 0.0.0.0\ns=-\nt=0 0\na=sendrecv\na=fingerprint:sha-256 54:5D:CF:E6:B6:B5:9B:60:C3:AB:F3:EC:5A:62:18:5E:13:F2:1A:23:86:03:BA:9D:D0:EA:67:7B:1C:5C:0A:2A\r\na=group:BUNDLE 0\r\na=ice-options:trickle\na=msid-semantic:WMS *\nm=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=sendrecv\na=ice-pwd:c2217ee835bac1bdc0a765ebf1b5de2c\na=ice-ufrag:b0ceda3e\na=mid:0\na=setup:actpass\na=sctp-port:5000\na=max-message-size:1073741823\n'})
      

      接着是 createAnswer。

      不要这样做。 rtp数据通道各方面都不如标准数据通道。不要使用它。

      【讨论】:

      • 另一种选择是您使用的是非常过时的 node-webrtc 版本。
      • 答案不是 "from Chrome",因为我理解了这个问题,尽管我不得不阅读它几次。我相信 OP 中的“Chrome 答案:”是指来自非浏览器端点的答案,在 Chrome 中设置为远程描述。无论如何,我将问题解释为来自 Firefox 在相同情况下的错误,即来自 setRemoteDescription
      猜你喜欢
      • 2017-06-26
      • 1970-01-01
      • 2014-05-23
      • 2016-10-17
      • 2016-12-06
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2021-08-03
      相关资源
      最近更新 更多