场景:您想知道 TURN 服务器是否用于特定呼叫,以及您在创建 PeerConnection 期间提供的 TURN 服务器数组中的哪一个正在使用。现在有两个选择:
- Wireshark:但是当您位于公司代理后面并且 TURN 服务器位于其外部时,wireshark 会将代理 IP 显示为目的地。(更不用说在后台运行它的不便了)
- 浏览统计页面并发现,chrome --> chrome://webrtc-internals 和 Firefox --> about:webrtc
我想使用上述两种方法的替代方案,以编程方式确定这一点,这样我就不必离开我的申请页面。
Update:我已经更新了示例以遵循最新规范,其中maplike getStats
.
下面的方法如下规格目前仅适用于 Firefox,因为 Chrome 实现了getStats()
目前不正确。希望有一个版本适配器.jspolyfill 应该很快就会推出,这也将使其在 Chrome 中也能工作。
当你跑步时这把小提琴在 Firefox 中,您会看到:
checking
connected
Does not use TURN
这是因为该示例同时提供了 STUN 和 TURN 服务器。但是当我修改配置以仅使用 TURN 时iceTransportPolicy: "relay"
, I see:
checking
connected
Uses TURN server: 10.252.73.50
请注意,我使用的转弯服务器位于 VPN 之后,因此它对您不起作用,但请随意使用您自己的服务器修改小提琴(只是不要保存它,除非您希望信息公开!)
虽然我还没有使用多个轮次服务器进行测试,但您可以看到显示的 IP 地址与配置的轮次服务器相匹配,因此应该可以使用这种方法来判断使用的是哪个服务器。
// Turn server is on Mozilla's VPN.
var cfg = { iceTransportPolicy: "all", // set to "relay" to force TURN.
iceServers: [{ urls: "stun:stun.l.google.com:19302" },
{ urls: "turn:10.252.73.50",
username:"webrtc", credential:"firefox" }] };
var pc1 = new RTCPeerConnection(cfg), pc2 = new RTCPeerConnection(cfg);
pc1.onicecandidate = e => pc2.addIceCandidate(e.candidate);
pc2.onicecandidate = e => pc1.addIceCandidate(e.candidate);
pc2.oniceconnectionstatechange = () => log(pc2.iceConnectionState);
pc2.onaddstream = e => v2.srcObject = e.stream;
var findSelected = stats =>
[...stats.values()].find(s => s.type == "candidate-pair" && s.selected);
var start = () => navigator.mediaDevices.getUserMedia({ video: true })
.then(stream => pc1.addStream(v1.srcObject = stream))
.then(() => pc1.createOffer()).then(d => pc1.setLocalDescription(d))
.then(() => pc2.setRemoteDescription(pc1.localDescription))
.then(() => pc2.createAnswer()).then(d => pc2.setLocalDescription(d))
.then(() => pc1.setRemoteDescription(pc2.localDescription))
.then(() => waitUntil(() => pc1.getStats().then(s => findSelected(s))))
.then(() => pc1.getStats())
.then(stats => {
var candidate = stats.get(findSelected(stats).localCandidateId);
if (candidate.candidateType == "relayed") {
log("Uses TURN server: " + candidate.ipAddress);
} else {
log("Does not use TURN (uses " + candidate.candidateType + ").");
}
})
.catch(log);
var waitUntil = f => Promise.resolve(f())
.then(done => done || wait(200).then(() => waitUntil(f)));
var wait = ms => new Promise(resolve => setTimeout(resolve, ms));
var log = msg => div.innerHTML += msg +"<br>";
var failed = e => log(e +", line "+ e.lineNumber);
<video id="v1" width="108" height="81" autoplay></video>
<video id="v2" width="108" height="81" autoplay></video><br>
<button onclick="start()">Start!</button><br><div id="div"></div>
<script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)