javascript – 用于信令的RTCDataChannel?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 用于信令的RTCDataChannel?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4706字,纯文字阅读大概需要7分钟。
内容图文
我一直在阅读this article的信号解决方案.作者提到在建立连接时使用RTCDataChannel进行信令.
Using RTCDataChannel for signaling
A signaling service is required to initiate a WebRTC session.
However, once a connection has been established between two peers, RTCDataChannel could, in theory, take over as the signaling channel. This might reduce latency for signaling — since messages fly direct — and help reduce signaling server bandwidth and processing costs. We don’t have a demo, but watch this space!
为什么需要信令,因为连接已经建立?
解决方法:
每一方最初声明它将发送哪些音频和/或视频轨道,以便可以打开正确数量的端口,并且可以确定适用于两个对等端的分辨率和格式.需要信令信道来将得到的SDP提供/应答以及每个端口的涓流ICE候选发送到另一侧.
一旦连接,如果你单独保留这个设置 – 基本上永远不会添加轨道到连接,删除任何,或显着改变轨道属性 – 那么你将不再需要信号服务器.
如果你确实改变了这些东西,那么就需要重新协商,这就像它听起来的那样:信号通道上的另一轮,就像第一轮一样.
添加轨道的原因可能是第二个摄像头,另一个视频源(可能来自另一个参与者),或者可能是屏幕共享,类似的东西.
该文章是正确的,可以使用数据通道.这是a demo! (目前仅限Firefox.)
如果您有另一种发现方式,那么该文章对于需要信令服务是错误的 – 正如这个演示蹩脚地证明的那样.
初始连接仅限聊天,但任何一方都可以推送添加视频.对此的重新协商是通过数据通道完成的(因为没有信令服务器!)
使用小提琴的说明:
>没有服务器(因为它是小提琴),所以按“提供”按钮并复制优惠.
>将商品粘贴到另一个标签或另一台机器上的同一个小提琴中的同一位置.
>按ENTER,然后复制你得到的答案并将其粘贴回第一个小提琴.
>再次按ENTER(不是addTrack!)
>您现在连接了两个数据通道:一个用于聊天,另一个用于信令.
>现在按两端的addTrack,视频应显示在另一端.
>按另一个方向的addTrack,你应该有双向视频.
var dc = null, sc = null, pc = new mozRTCPeerConnection(), live = false;
pc.onaddstream = e => v2.mozSrcObject = e.stream;
pc.ondatachannel = e => dc? scInit(sc = e.channel) : dcInit(dc = e.channel);
v2.onloadedmetadata = e => { log("Face time!"); };
function addTrack() {
navigator.mediaDevices.getUserMedia({video:true, audio:true})
.then(stream => pc.addStream(v1.mozSrcObject = stream));
}
pc.onnegotiationneeded = e => {
pc.createOffer().then(d => pc.setLocalDescription(d)).then(() => {
if (live) sc.send(JSON.stringify({ "sdp": pc.localDescription }));
}).catch(failed);
};
function scInit() {
sc.onmessage = e => {
var msg = JSON.parse(e.data);
if (msg.sdp) {
var desc = new mozRTCSessionDescription(JSON.parse(e.data).sdp);
if (desc.type == "offer") {
pc.setRemoteDescription(desc).then(() => pc.createAnswer())
.then(answer => pc.setLocalDescription(answer)).then(() => {
sc.send(JSON.stringify({ "sdp": pc.localDescription }));
}).catch(failed);
} else {
pc.setRemoteDescription(desc).catch(failed);
}
} else if (msg.candidate) {
pc.addIceCandidate(new mozRTCIceCandidate(msg.candidate)).catch(failed);
}
};
}
function dcInit() {
dc.onopen = () => { live = true; log("Chat!"); };
dc.onmessage = e => log(e.data);
}
function createOffer() {
button.disabled = true;
dcInit(dc = pc.createDataChannel("chat"));
scInit(sc = pc.createDataChannel("signaling"));
pc.createOffer().then(d => pc.setLocalDescription(d)).catch(failed);
pc.onicecandidate = e => {
if (e.candidate) return;
if (!live) {
offer.value = pc.localDescription.sdp;
offer.select();
answer.placeholder = "Paste answer here";
} else {
sc.send(JSON.stringify({ "candidate": e.candidate }));
}
};
};
offer.onkeypress = e => {
if (e.keyCode != 13 || pc.signalingState != "stable") return;
button.disabled = offer.disabled = true;
var obj = { type:"offer", sdp:offer.value };
pc.setRemoteDescription(new mozRTCSessionDescription(obj))
.then(() => pc.createAnswer()).then(d => pc.setLocalDescription(d))
.catch(failed);
pc.onicecandidate = e => {
if (e.candidate) return;
if (!live) {
answer.focus();
answer.value = pc.localDescription.sdp;
answer.select();
} else {
sc.send(JSON.stringify({ "candidate": e.candidate }));
}
};
};
answer.onkeypress = e => {
if (e.keyCode != 13 || pc.signalingState != "have-local-offer") return;
answer.disabled = true;
var obj = { type:"answer", sdp:answer.value };
pc.setRemoteDescription(new mozRTCSessionDescription(obj)).catch(failed);
};
chat.onkeypress = e => {
if (e.keyCode != 13) return;
dc.send(chat.value);
log(chat.value);
chat.value = "";
};
var log = msg => div.innerHTML += "<p>" + msg + "</p>";
var failed = e => log(e.name + ": " + e.message + " line " + e.lineNumber);
<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>
<button id="button" onclick="addTrack()">AddTrack</button>
<div id="div"></div><br>
Chat: <input id="chat"></input><br>
内容总结
以上是互联网集市为您收集整理的javascript – 用于信令的RTCDataChannel?全部内容,希望文章能够帮你解决javascript – 用于信令的RTCDataChannel?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。