服务器端(动态ICE服务器)上的WebRTC异步调用

时间:2020-08-04 06:58:54

标签: webrtc simple-peer

我正在尝试通过服务器端的动态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 failedTransport channel closed甚至是Failed to execute 'setRemoteDescription' on 'RTCPeerConnection': Failed to set remote answer sdp: Called in wrong state: kStable

我缩小了范围,我相信这种异步行为会在连接时导致某种错误的事件顺序。我不知道确切的原因和原因,但是有没有办法使用这些动态iceServers?它们在120秒后过期,因此每个字符串都是唯一的。就像我提到的那样-以下代码对99.9%的人有效。只是几个而已。

0 个答案:

没有答案
相关问题