用于实时缩放的WebRTC



我正在为一个通道中的许多用户寻找一个廉价的实时缩放解决方案。

我使用的是sockjs,但当谈到非常大的数字时,缩放非常烦人。

我正在考虑使用webrtc来降低p2p的成本。服务器不会连接到所有用户,而是只连接到有限数量的用户,然后这些用户将通过webrtc将他们的数据分发到p2p网络。这明智吗?实现最简单的方法是什么?

该信息不是私有的,并且几秒钟<5秒的延迟是可以接受的。

是的,这就是webRTC的作用:在没有服务器的情况下在浏览器之间交换数据。要做到这一点,您可能需要在管理连接的服务器上制定一些管理计划(因为一个客户端需要告诉另一个客户端"嘿,我在这里,连接到我…"),并考虑当客户端需要连接到其他人时,哪个客户端上有哪些数据。

作为提示:我在nodejs中制作了一个服务器,使用websockets(和nodejs插件:"ws")在客户端之间进行通信,直到设置了RTC,以便它们可以流式传输音频。做所有这些事情真的很容易,但提炼起来很痛苦。

正如我从你的问题中看到的,你没有使用webRTC的经验。只是为了让你领先一步,这是制作RTC所需的正确顺序:

Client 1                        Server       Client 2
Create an RTC object
Create offer
set localdescription = offer                 Create RTC object                   
send offer ------------------->       ------>set remote description to offer
Create answer
local description = answer
set remote description<--------       <------send answer
This goes both directions:
onicecandidate send ---------->       ------>set ICE candidate
Connection done!

对于交换这个连接数据,我的建议是使用websocket。两个客户端都打开一个websocket,无论何时一个客户端发送内容,您都可以从另一个客户端获取websocket连接(它是一个对象)并发送内容。使用XHR,您只能让浏览器连接,请求数据,如果数据不存在,请在x秒内重试。

sum:使用和设置用于对等连接的webRTC相当容易,但管理谁应该连接到谁会有很多麻烦。

编辑:我的想法是,第一个客户端连接到服务器,并通过XHR或websocket或类似的东西接收它的数据。如果你想要浏览器兼容性,你可能想使用socket.io,但这并不重要,因为只有chrome和firefox支持webRTC(afaik)。然后你只需从浏览器连接到服务器。如果你确实计划在同一时间进行多个交换,那么会话ID将非常方便,这样你就可以与需要下载它的人进行交换

在服务器端,websockets返回一个"包含"当前连接的对象。因此,如果客户端1要连接,您可以将其存储在具有我们创建的ID的对象中。如果客户端2要连接,您也可以存储它。然后,您可以从第一个客户端获取websocket对象并执行.send('your message')

现在我该怎么做。我将使用(ws)来确定通过websocket的连接,(http)用于http请求,(rtc)用于webRTC。pc是您的对等连接对象:window.dc = new RTCDataChannel(ICEServers);sdp表示SessionDescriptionProtocol

  1. 客户端连接到您的服务器并下载必要的文件(http)(我指的是网页、脚本和css,而不是您想要共享的文件)
  2. 客户端请求新会话。(ws)
  3. 服务器在对象内创建会话的实例。

    var sessID=Math.random().toString(36).substring(12,16)
    sessions[ssesID]={};

  4. 您将此会话ID发送给客户端(ws),以便它可以将此ID发送给其他人(使用邮件等)。另一个用户连接到服务器(http)(ws),但没有请求ID,而是发送它

  5. 当服务器接收到这一消息时,它向第一个客户端和这个客户端发送一条消息,其中包含双方都准备好了。发送客户端创建一个新的webRTC对象,并创建一个新报盘(它将此报盘存储在dc.setLocalOffer(sdp)中)。它将其发送到服务器(ws),服务器将其发送给客户端2(ws)。现在,客户端使用dc.setRemoteDescription(sdp)存储它,并创建一个答案。(dc.createAnswer()),设置这个答案(dc.setLocalDescription(sdp)。这个答案被发送到客户端一。现在你可以使用数据通道了

我不知道数据通道是如何工作的,因为我只使用过PeerConnection,它特别适用于音频和视频流。您可以使用它来了解如何建立连接。这方面的代码在我的回购中。里面有更多的代码,因为这是一个"profielwerkstuk"(我和一个朋友一起为学校做的一些工件)。您感兴趣的是server.js(这是nodejs服务器,用于交换sdp和ICE候选者)。网页在htdocs/mp.html中(不是很有趣),而实现这一切的javascript代码在htdocs/scripts/rtc.js.上

有关更多信息,您可能想看看这个例子,以及这里的解释

已经有了"你想要的东西",它使用了大量的代码来实现这一点。另外请注意,stackoverflow是用来提问的,而不是用来询问现成的代码。如果你想要,看看carrers 2.0,找到一个愿意为你做这件事的人。

编辑2:现在我看到了你的答案,我认为最好的方法是将所有连接存储在会话对象内的数组中,然后连接客户端1->2、2->3、3->4等。但是,好吧,你会遇到部件等问题。想想种子下载,你可以连接到多个人,并从每个人那里下载小部分。是的,这真的很难,我不认为有人已经做了这么大的事情(除了sharefest)。如果你真的想做到这一点,你需要自己做得最多。花一些时间思考如何解决这个问题,并使用stackoverflow(或其他信息网站)来寻找如何设置rtc等。

完全合理。

WebRTC是浏览器中的低延迟P2P网络。如果用户的浏览器支持DataChannel,那么您可以使用类似WebTorrent的库https://github.com/feross/webtorrent.

还可以看看Sharefest的实现:https://www.sharefest.me/这与你想要的想法非常相似。

要开始,请查看HTML5 Rocks WebRTC教程:http://www.html5rocks.com/en/tutorials/webrtc/basics/.SimpleWebRTC库也非常方便:http://simplewebrtc.com/

是的,这是非常明智的,WEBRTC是实时通信的第二大优势!它之所以如此明智,是因为它是用Javascript完成的。随着时间的推移,它正在以数百万的速度增长,并在更多的平台上得到支持;高品质!

我不是来抨击你或其他什么的,但webrtc随时都会把Node从水里吹出来。

选择webrtc,你知道你想;)

最新更新