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