为什么WebRTC需要Signaling Server?
WebRTC是定义对等之间的媒体数据的传输方法的协议。 了解。 它也可以在RTP / UDP之上工作。 这也理解了。
在讨论有关Signaling Server时,提到它需要做兼容性检查/信道启动等工作。
我的问题是:上面说过,
1)这是否意味着信令服务器是强制性的?
2)WebRTC是否有智能与对方直接对话而无需签名服务器?
3)与webRTC相关的每一篇文章都是从“浏览器到浏览器通信之间?”这个状态开始的,这是不是说webRTC不能在a)带摄像头的embedded式设备[无浏览器],b)浏览器到别的地方使用。
4)另外,如果使用webRTC与传统的浏览器stream式传输方式相比有什么收获? [我真的不知道传统的方式]。
我知道这是一个理论问题。 虽然,我看到这种问题可能在不同的背景下浮现在互联网上。 希望这个问题给一些架构级别的答案。 谢谢。
WebRTC不解决发现(也不应该)。
WebRTC知道如何在没有信令服务器的情况下直接与另一个对等方通话,但不知道如何发现另一个对等方。 发现是一个固有的问题,所以我有点困惑,人们期望WebRTC为他们解决这个问题。
想一想:你打算怎么打电话给我? 你打算如何引导你的电脑与我联系,而不是十亿其他人? 通过GPS坐标? 电子邮件地址? 静态IP? IRC? 即时消息? Facebook的? 电话号码?
另外,我打电话时怎么知道? 我的电脑会“响”吗? 有数百种方法可以用常规的Web技术来解决这个问题,所以如果WebRTC需要一个特定的方法,WebRTC会给你带来不便。 您的应用程序的上下文可能会通知最佳的联系方式。 也许我在networking游戏的一些在线论坛或虚拟室遇到你?
从技术上说,只要你有其他的方法来获得一个SDP offer(一段文本)给你的peer,并且得到相应的SDP答案作为回报,你不需要一个带有WebRTC的信令服务器文字,IM,irc,电子邮件或信鸽。 在Chrome或者Firefox上试试这个: https : //jsfiddle.net/nnc13tw2 – 点击“Offer”(最多等待20秒),将输出发送给你的朋友,他们将其粘贴到同一个字段的末尾,然后点击Enter,让他们发回答案,在答案字段中粘贴,然后按Enter键。 你现在应该连接,并没有涉及连接服务器。
为什么jsfiddle有效:它将SDP中的所有ICE考生打包,这可能需要几秒钟,一次性给你提供你所需要的一切。
一些高级function,如改变中间呼叫video源的数量等也需要信令,但是一旦呼叫build立,应用可以使用其自己的数据信道来进行对等之间的任何进一步的信令需求。
Stackoverflow现在要求我包含代码链接到jsfiddle,所以我不妨将它包括在这里(尽pipe如果你在Chrome上面使用上面的提琴,因为相机访问似乎不能在片段中工作):
var config = { iceServers: [{ urls: "stun:stun.l.google.com:19302" }]}; var dc, pc = new RTCPeerConnection(config); pc.onaddstream = e => v2.srcObject = e.stream; pc.ondatachannel = e => dcInit(dc = e.channel); v2.onloadedmetadata = e => log("Connected!"); var haveGum = navigator.mediaDevices.getUserMedia({video:true, audio:true}) .then(stream => pc.addStream(v1.srcObject = stream)) .catch(failed); function dcInit() { dc.onopen = () => log("Chat!"); dc.onmessage = e => log(e.data); } function createOffer() { button.disabled = true; dcInit(dc = pc.createDataChannel("chat")); haveGum.then(() => pc.createOffer()).then(d => pc.setLocalDescription(d)).catch(failed); pc.onicecandidate = e => { if (e.candidate) return; offer.value = pc.localDescription.sdp; offer.select(); answer.placeholder = "Paste answer here"; }; }; offer.onkeypress = e => { if (!enterPressed(e) || pc.signalingState != "stable") return; button.disabled = offer.disabled = true; var desc = new RTCSessionDescription({ type:"offer", sdp:offer.value }); pc.setRemoteDescription(desc) .then(() => pc.createAnswer()).then(d => pc.setLocalDescription(d)) .catch(failed); pc.onicecandidate = e => { if (e.candidate) return; answer.focus(); answer.value = pc.localDescription.sdp; answer.select(); }; }; answer.onkeypress = e => { if (!enterPressed(e) || pc.signalingState != "have-local-offer") return; answer.disabled = true; var desc = new RTCSessionDescription({ type:"answer", sdp:answer.value }); pc.setRemoteDescription(desc).catch(failed); }; chat.onkeypress = e => { if (!enterPressed(e)) return; dc.send(chat.value); log(chat.value); chat.value = ""; }; var enterPressed = e => e.keyCode == 13; var log = msg => div.innerHTML += "<p>" + msg + "</p>"; var failed = e => log(e);
<video id="v1" height="120" width="160" autoplay muted></video> <video id="v2" height="120" width="160" autoplay></video><br> <button id="button" onclick="createOffer()">Offer:</button> <textarea id="offer" placeholder="Paste offer here"></textarea><br> Answer: <textarea id="answer"></textarea><br><div id="div"></div> Chat: <input id="chat"></input><br> <script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>
- 是的,信令是强制性的,以便ICE候选者等交换,以便对等连接知道他的同伴是谁
- 不,如果不进行某种交换,它会如何知道它的同伴呢?
- 不,这并不意味着。 我做了大量的实验,使用raspis和其他本地设备,通过WebRTC对等连接将videostream式传输到浏览器页面。
- 你在说什么? 你意味着使用WebRTC vs Flash和中央服务器的好处? WebRTC是点对点的,如果你将它与GetUserMedia和Html5结合起来,你就不再需要Flash和一个中央媒体服务器来处理所有的媒体交换。
您需要一个信令服务器才能build立两个任意对等体之间的连接; 这是今天使用的互联网架构的一个简单的现实。
要联系networking上的其他同行,您需要先了解其IP地址。 有第一个问题了。 你需要知道对方的IP地址是什么。 你如何从同行A到同行B得到这些信息,而没有坐在这些计算机上的人们通过电话互相呼叫并指定IP地址? 为此,每个对等方首先发现自己的地址,然后将其发送给对方。 这又带来另外两个问题:一个对等方如何发现它的外部IP地址(可能与它自己的IP有很大的不同),以及它如何与另一个未知地址的对等方通信呢?
这是一个信号服务器进来的地方。两个对等端在连接到对方之前都有一个到信令服务器的连接。 所以他们使用信令服务器来代表他们中继消息,直到他们谈妥了一个直接的谈话方式。 有可能在本地子网上没有第三方帮助的情况下协商连接; 但是这种情况可能非常罕见,我甚至不确定规范是否解决了这个问题。
至于3):WebRTC可以在任何设备上实现,只是一个协议; 它不是专门针对浏览器的。
至于4):从一个浏览器到另一个浏览器的“传统”方式总是涉及一个中间服务器。 该服务器具有较大的CPU和带宽要求,是一个昂贵的瓶颈。 除了轻量级的信令服务器之外,WebRTC允许直接的P2P连接,无需中间人。 而且,之前也没有一个开放的标准 。 大多数情况下,你会以某种方式向Adobe支付一些费用。
大部分的答案已经被覆盖,只是想我会添加一些东西。 当Google在4年前首次创buildwebRTC并开放源代码时,它自己完全没有任何信号function。
不过,最近Google购买了Firebase,所以我打赌他们很快就会开放一个完整的WebRTC端到端解决scheme,这样我们所有人都可以更容易的实现它。
说到Firebase,我试了一下,并没有坏,完成了基本的工作: http : //antonvolt.com/prototype2/