ElS*_*jko 6 javascript peer webrtc
我试图了解 WebRTC 的工作原理,主要是仅使用 DataChannel 来获得游戏网络体验。这就是我到目前为止所做的。它聚集了 ICE 候选人。我有两个问题。
offerToReceiveAudioorofferToReceiveVideo需要设置为 true,我只会使用Datachannel. (如果没有将此选项之一设置为 true,则不会出现 ICE)(已解决,请参阅下面的编辑)这是一个小提琴:
https://jsfiddle.net/t431a815/9/
和代码:
var iceServers = [
]
var config = {
iceServers: iceServers,
iceTransportPolicy: "all",
rtcpMuxPolicy: 'negotiate'
};
var pcConstraints = {};
var offerOptions = {offerToReceiveAudio: true};
pcConstraints.optional = [{'googIPv6': true}]; // Whether we gather IPv6 candidates.
var pc = new RTCPeerConnection(config, pcConstraints);
pc.onicecandidate = iceCallback;
pc.createOffer(
offerOptions
).then(
gotDescription,
error
);
function gotDescription(desc) {
console.log("OFFER DESC:", desc);
pc.setLocalDescription(desc);
}
function error() {
console.log("sth goes wrong", arguments);
}
function iceCallback(event) {
console.log("ICE!", JSON.stringify(event.candidate));
}
Run Code Online (Sandbox Code Playgroud)
编辑:
找到了解决方案,但很奇怪,您只需要在报价之前创建一个数据通道,然后它就可以使用offerToReceiveAudio: false, offerToReceiveVideo: false
var offererDataChannel = pc.createDataChannel('channel', {});
Run Code Online (Sandbox Code Playgroud)
但为什么?如果我想稍后创建它怎么办?
你需要发送一些东西。否则,这就像运送一个里面空无一物的盒子,或者流式传输没有内容的流。没有任何好处。
建立对等连接的所有工作都是为每个需要发送的内容协商工作 IP+端口对。例如,一对用于视频、一对用于音频、和/或一对用于数据。
最容易看出这一点的是每件产品在报价 SDP 中都需要自己的“m 线”。
var pc = new RTCPeerConnection();
pc.createDataChannel("dummy");
pc.createOffer().then(({sdp}) =>
sdp.split('\r\n').filter(s => s.startsWith('m=')).map(s => console.log(s)));Run Code Online (Sandbox Code Playgroud)
<script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>Run Code Online (Sandbox Code Playgroud)
稍后添加视频或音频(或者如果最初没有数据则添加数据)需要重新协商,这与初始协商的成本相同。
例外的是额外的数据通道,它们都通过同一端口进行多路复用,无需重新协商,因为,您知道,现在对等点之间有一个数据通道。
换句话说,如果您想稍后添加数据通道,请预先创建一个虚拟通道。随后所有的数据通道基本上都是免费的。相反,如果您稍后需要费用,请稍后连接。
| 归档时间: |
|
| 查看次数: |
1642 次 |
| 最近记录: |