我正在尝试通过服务器端的动态ICE服务器实现WebRTC服务。
有人进入会议室时,我的服务器端代码如下:
socket.on("video_join", async (data) => {
let token = data.token;
let room = rooms[token];
let user = {
id: socket.id,
name: data.name
};
let iceServers = await getICEServers();
if (!iceServers) {
io.to(socket.id).emit("video_error");
return;
}
if (rooms[token]) {
rooms[token].users.push(user);
} else {
rooms[token] = {
users: [user]
};
}
socketToRoom[socket.id] = token;
io.to(socket.id).emit("video_joined");
rooms[token].users.map((user: any) => {
if (user.id !== socket.id)
io.to(user.id).emit("video_users", {
peers: rooms[token].users,
iceServers,
});
});
});
您会注意到,ICEServer是我正在等待的异步功能。
在前端,东西看起来像这样:
this.io.on("video_users", (data: any) => {
data.peers.map((peer: any) => {
if (!this.peers[peer.id] && peer.id !== this.state.id) {
this.peers[peer.id] = this.generatePeer(
peer.id,
true,
data.iceServers
);
}
});
});
基本上会生成一个发起方对等体:
generatePeer(id: string, initiator: boolean = false, iceServers: any = null) {
if (!iceServers) return null;
let peer = new Peer({
initiator: initiator,
trickle: false,
config: {
iceServers: iceServers
},
stream: this.state.stream
});
peer.on("signal", (data: any) => {
if (this.state.id !== id) {
this.io.emit("video_signal", {
signal: data,
to: id,
name: this.state.name,
iceServers: iceServers
});
}
});
//...Some more irrelevant code
}
最后发出信号:
this.io.on("video_new_signal", async (data: any) => {
let id = data.from;
if (id !== this.state.id) {
if (!this.peers[id]) {
this.peers[id] = this.generatePeer(id, false, data.iceServers);
}
this.peers[id].signal(data.signal);
}
});
现在的问题是,一些用户(实际上是少数几个)正在获得Ice connection failed
或Transport channel closed
甚至是Failed to execute 'setRemoteDescription' on 'RTCPeerConnection': Failed to set remote answer sdp: Called in wrong state: kStable
。
我缩小了范围,我相信这种异步行为会在连接时导致某种错误的事件顺序。我不知道确切的原因和原因,但是有没有办法使用这些动态iceServers
?它们在120秒后过期,因此每个字符串都是唯一的。就像我提到的那样-以下代码对99.9%的人有效。只是几个而已。