WebRTC是一种协议,用于定义Peer to Peer之间的媒体数据的传输方法。了解。它也适用于RTP / UDP。这也理解了。
在讨论有关信令服务器的过程中,提到它需要进行兼容性检查/通道启动......等工作正常。
我的问题是:上面说过,
1)这是否意味着信令服务器是强制性的?
2)WebRTC是否具有在没有签名服务器的情况下直接与其他对等方交谈的智能?
3)与webRTC相关的每篇文章都以"浏览器与浏览器之间的通信状态开始?",是否意味着,webRTC不能用于a)带摄像头的嵌入式设备[无浏览器],b)其他地方的浏览器。
4)此外,如果使用webRTC与传统的流式传输方式相比,获得的收益是多少? [老实说,我不知道遗留的方式]。
我知道这是一个理论问题。虽然,我看到这种问题可能在不同的背景下浮现在互联网上。希望这个问题能给出一些架构层面的答案感谢。
答案 0 :(得分:39)
WebRTC不解决发现问题(也不应该解决)。
WebRTC知道如何在没有信令服务器的情况下直接与另一个对等方通话,但它不知道如何发现另一个对等方。发现是一个固有的问题,所以我有点困惑,人们希望WebRTC为他们解决它。
想一想:你打算怎么称呼我?您如何指导您的计算机与我联系而不是其他十亿人?通过GPS坐标?电子邮件地址?静态IP? IRC?即时消息? Facebook的?电话号码?
另外,我怎么知道你什么时候打电话?我的电脑会“响”吗?使用常规Web技术有数百种方法可以解决这个问题,因此如果WebRTC采用特定的方式,那么它将对您造成伤害。您的申请背景可能会告知最佳联系方式。也许我在一个在线论坛或在线游戏的虚拟房间遇到你?
从技术上讲,只要您有其他方法可以获得SDP(一段文本)给您的同行,并且接收到互惠的SDP回答,无论是电话文本,IM,IR,电子邮件还是载体鸽。在Chrome或Firefox中尝试此操作:https://jsfiddle.net/nnc13tw2 - 点击“优惠”(等待最多20秒),将输出发送给您的朋友,将其粘贴到其末尾的相同字段中并点击Enter,然后让他们发回答案,您粘贴在答案字段中并按Enter键。您现在应该已连接,并且从未涉及任何连接服务器。
为什么jsfiddle工作:它将所有ICE候选人打包在SDP中,这可能需要几秒钟,一次性为您提供所需的一切。
一些高级功能,例如在呼叫中等时改变视频源的数量也需要信令,但是一旦建立了呼叫,应用就可以使用自己的数据信道来满足对等体之间的任何进一步信令需求。
Stackoverflow现在要求我包含链接到jsfiddle的代码,所以 我也可以在这里包括它(虽然如果你在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>
答案 1 :(得分:8)
答案 2 :(得分:6)
您需要一个信令服务器才能在两个任意对等体之间建立连接;它是当今使用的互联网架构的简单现实。
要联系网络上的其他对等方,您需要先了解其IP地址。已经存在第一个问题。您需要知道对等方的IP地址。如果没有坐在这些计算机上的人通过电话互相通话并指示IP收件人,你将如何从对等方A获得此信息?为此,每个对等体首先发现自己的地址,然后将其发送给另一个对等体。这会打开另外两个问题:对等体如何发现其向外的IP地址(可能与其自身的IP有很大不同),以及如何将此信息传达给未知地址的其他对等体?
这是信令服务器的用武之地。两个对等体在彼此连接之前都与信令服务器建立了连接。因此,他们使用信令服务器代表他们转发消息,直到他们协商了直接的谈话方式。在本地子网上没有第三方帮助的情况下协商连接是可能的;但这种情况可能很少见,我甚至不确定该规范是否正在解决它。
至于3):WebRTC可以在任何设备上实现,它只是一个协议;它并不仅限于浏览器。
至于4):&#34;遗产&#34;从一个浏览器到另一个浏览器的任何流式传输方式总是涉及中间的中继服务器。该服务器具有很高的CPU和带宽要求,是一个昂贵的瓶颈。除轻量级信令服务器外,WebRTC无需中间人即可实现直接P2P连接。此外,之前并没有真正的开放标准;大部分时间你都会以这种或那种方式向Adobe支付一些钱。
答案 3 :(得分:0)
大部分答案都已涵盖,只是想我添加了一些东西。当Google第一次创建webRTC并在4年前开源时,它就严格按照自己的要求进行操作,没有任何信令功能。
然而,最近谷歌收购了Firebase,所以我很快就会打赌,他们将很快为WebRTC开放一个完整的端到端解决方案,这样我们所有人都可以更轻松地实施它。
说到Firebase,我尝试了它并且它还不错,完成了基本的工作:http://antonvolt.com/prototype2/