WebRTC:对多个对等连接使用相同的 SDP?

Posted

技术标签:

【中文标题】WebRTC:对多个对等连接使用相同的 SDP?【英文标题】:WebRTC: Use same SDP for multiple peer connections? 【发布时间】:2014-03-14 08:05:20 【问题描述】:

是否可以在多个对等连接中使用相同的 SDP?

我正在使用 WebRTC 构建视频会议。这个想法是呼叫者使用某种信令机制,使用它的 SDP(每个用户的 SDP 相同)向所有其他用户发送广播消息,然后用户将使用他们的 SDP 进行响应。

当用户收到某人的 SDP 时,他用它来设置远程描述,像这样:

connection = new RTCPeerConnection()
desc = RTCSessionDescription(sdp: SDP, type: "offer");
connection = setRemoteDescription(desc);

这里是 SDP 示例:

v=0
o=- 6843023960119608301 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE audio
a=msid-semantic: WMS
m=audio 1 RTP/SAVPF 111 103 104 0 8 106 105 13 126
c=IN IP4 0.0.0.0
a=rtcp:1 IN IP4 0.0.0.0
a=ice-ufrag:q36dZRVoaS4ixPYP
a=ice-pwd:K5yAm4A+zGoIKIgsX9o4VgDA
a=ice-options:google-ice
a=fingerprint:sha-256 62:3E:99:2F:FF:D4:58:7C:F0:A1:02:3F:09:2B:D1:F3:71:D7:F6:59:62:12:E4:1B:4A:68:01:4C:43:E0:D1:75
a=setup:actpass
a=mid:audio
a=extmap:1 urn:ietf:params:rtp-hdrext:s-s-rc-audio-level
a=recvonly
a=rtcp-mux
a=crypto:0 AES_CM_128_HMAC_SHA1_32 inline:Tdz5Z3KHB3Xosqr5D53WZfi7Zndz+932X3H46Qvf
a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:NJO4XhhHUgiJRCfyYzDgajkCJAF/9BX8QeU+FKQs
a=rtpmap:111 opus/48000/2
a=fmtp:111 minptime=10
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:106 CN/32000
a=rtpmap:105 CN/16000
a=rtpmap:13 CN/8000
a=rtpmap:126 telephone-event/8000
a=maxptime:60

我在这里没有看到任何独特的东西,所以如果 B 和 D 将其用作远程描述,它会起作用吗?如果是 - 我如何生成此 SDP?我目前知道的唯一方法是使用RTCPeerConnection.createOffer,但这会创建不需要的对等连接对象(根据我的想法,应在收到其他用户的响应后创建对等对象)。

【问题讨论】:

a=recvonly 在上面的 SDP 中,我如何使它成为 a=sendrecv。 @hanu,我猜是使用一些字符串替换或正则表达式函数。 得到它.. 它的 pc.addstream 然后 pc.createoffer 【参考方案1】:

不,WebRTC 不是这样设计的。您需要为一个对等方创建单独的 PeerConnection。

【讨论】:

我将为每个对等点创建单独的 PeerConnection。问题是可以对这个连接使用相同的 SDP 吗? 每个 PeerConnection 都有自己的本地和远程 SDP,它们不能相同。 ICE、DTLS、端口信息都是不可复用的;所有这些项目对于每个对等配对都必须是唯一的。【参考方案2】:

您可以使用相同的 SDP,只要它不包含候选字段! 这些候选字段绑定到本地 RTP 端口,不可重用。

【讨论】:

这将如何工作?据我了解,ICE 候选人是在创建 SDP(提供或回答)之后生成的。因此,如果我们为现有客户端重新使用 offer SDP,但新节点的候选 ICE 会有所不同,我们如何生成新的 ICE 候选发送给新节点?【参考方案3】:

不,如果您找到解决此问题的方法,那将是一个非常糟糕的主意。互联网上两个端点之间的“连接”概念实际上可以分解为两点之间协商的会话。此会话可能具有对于每个“连接”都相同的字段,但其他字段对于每个对等点都是唯一的。 TCP 是通过创建基本连接会话作为其规范的一部分而开发的。 WebRTC 始终通过 UDP 进行通信(即使在通过 TCP 隧道的情况下),并且 UDP 没有连接的概念。 WebRTC 在创建连接会话的过程中使用 SDP,而 SDP 会发现/定义每个连接所需的所有字段。

【讨论】:

【参考方案4】:

我认为您正在尝试开发多个广播(从上图),可以在 webrtc 中创建多个对等点(例如,如果您想在两个浏览器中广播您的视频,则需要两个对等点连接方式)

SDP:此协议包含您的浏览器信息,例如您的公共 ip、端口、编解码器和通信方式方式(仅音频、仅视频、数据通道等)

因此,如果您想与其他对等点通信(因为您的公共 ip、端口、编解码器)相同,则上述信息很常见,因此可以共享您的 sdp 多个对等点(注意:您为每个用户打开新对等点)

【讨论】:

除此之外,当使用两个对等连接时,SDP 中存在一些不同之处,因此最好的方法是重新使用 sdp 和只需创建一个新的。 所以有可能,但我最好不要重复使用它? 在我的情况下,最大用户数可以是 9。所以在这种最大情况下,这意味着 32 个对等连接。如果我可以向每个用户发送一个 SDP,那么我只需要 9 条(广播)消息即可完成 SDP 交换。否则,我将收到 72 条消息(32 个提议和 32 个答案),并且确定哪个对等方应该发送提议以及应该等待它发送答案的问题。 我认为,原则上没有在协议级别实现重用:patchwork.ozlabs.org/patch/916781

以上是关于WebRTC:对多个对等连接使用相同的 SDP?的主要内容,如果未能解决你的问题,请参考以下文章

我如何创建webrtc的仅接收sdp报价?

如何在Chrome for WebRTC应用程序中记录/查看ICE连接检查消息?

web技术分享| 实现WebRTC多个对等连接

web技术分享| 实现WebRTC多个对等连接

多个 webRTC 连接

WebRTC 对等服务器连接