【发布时间】:2021-06-18 19:18:31
【问题描述】:
建筑师
- 网页使用RTCPeerConnection 创建连接。它在其配置中使用 STUN 和 TURN 服务器。只有在收集完所有候选人后,它才会创建一个报价并将报价发送给远程客户端
if(pc.iceGatheringState === "complete"){
const resp = await fetch("REMOTE URL", {
method: "post",
body: JSON.stringify({
offer: btoa(JSON.stringify(pc.localDescription)),
}),
});
const sdp = await resp.text();
pc.setRemoteDescription(
new RTCSessionDescription(JSON.parse(atob(sdp)))
).catch((e) => console.log(e));
}
-
远程 (GO) 服务器使用 REST API 接受 offer 并以 answer 响应。只有在远程对等点上收集了所有候选者之后才会发送答案。 IE。在收到
""候选人之后 -
远程服务器有一个本地 RTP 流正在发送到主机。主机在发送
offer之前添加一个收发器
pc.addTransceiver("video", { direction: "recvonly" });
- 当收到
onTrack事件时,stream被添加到变量中,并且仅当iceConnectionState更改为connected时设置为<video>组件的srcObject
问题
上述设置在本地网络的情况下完美运行。主持人和同伴都选择了host 候选人,视频播放完美。
使用远程连接时,无论是 STUN (srflx) 候选者还是 TURN(relay) 候选者,视频都不会播放。
chrome://webrtc-internals 清楚地表明 Transport 选择了正确的候选者,但所选的 local 候选者没有流量。
我可以看到在远程对等方上使用 UDP 转储,视频流正在完美发送。
调试信息
- 在远程网络上,使用
srflex候选者,nack和pli计数与本地网络相比非常高
For approx 15 sec of video
pliCount:
local: 5
remote: 221
nackCount:
local: 7
remote: 2577
【问题讨论】:
标签: webrtc video-streaming stun