PeerJs 关闭视频通话不触发关闭事件

PeerJs close video call not firing close event

我正在尝试使用 PeerJs 创建一个单向视频应用程序。我已经成功地能够 运行 我自己的对等服务器并通过单击按钮进行连接,但是我无法关闭连接以便对等方可以 receive/establish 与新对等方建立新连接。

每个用户要么是宿主,要么是客户端,永远不会倒退。因此主机可以选择连接到哪个客户端,客户端将开始将其摄像头反馈流式传输回主机。单击按钮调用 closeCon() 函数。

    $(document).ready(function(){
      peer = new Peer('100001', {host: 'my.url', port: '9900', path: '/peerjs', key: 'peerjs', secure: true, debug: 3});
      peer.on("open", function(id) {
          console.log("My peer ID is: " + id);
      });
        video = document.getElementById('vidSrc');
    })


    function callTheGuy(id){
      var getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
      getUserMedia({video: true, audio: false}, function(stream) {
        window.call = peer.call(id, stream);
        localStream = stream;
        window.call.on('stream', function(remoteStream) {
          let video = document.getElementById('vidArea');
          video.srcObject = remoteStream;
          video.play();
          $("#videoModal").modal('show')
        });
      }, function(err) {
        console.log('Failed to get local stream' ,err);
      });
      }

      function closeCon(){
        window.call.close();
      }

这一切都很好,我得到了我的视频源,没问题。这是我的客户端代码:

peer = new Peer(serverId, {
    host: "my.url",
    port: "9900",
    path: "/peerjs",
    key: "peerjs",
    debug: 3,
    secure: true
});

peer.on("open", function(id) {
    console.log("My peer ID is: " + id);
});

var getUserMedia =
    navigator.getUserMedia ||
    navigator.webkitGetUserMedia ||
    navigator.mozGetUserMedia;
peer.on("call", function(call) {
    getUserMedia(
        { video: true, audio: false },
        function(stream) {
            localStream = stream;
            call.answer(stream); // Answer the call with an A/V stream.
        },
        function(err) {
            console.log("Failed to get local stream", err);
        }
    );
    call.on("close", function() {
        console.log("closing");
    });
});

问题是当我调用 closeCon() 时,客户端文件没有收到关闭事件。

的部分
call.on("close", function() {
        console.log("closing");
    });

永远不会被解雇。我不确定为什么会发生这种情况,但除非关闭事件得到处理,否则客户端会保持与原始主机的连接,并且无法接受来自后续主机请求的连接。有人有什么建议吗?

2021 年 3 月 7 日更新

我发现这是个问题,PeerJs 还没有修复。 (问题link:https://github.com/peers/peerjs/issues/636

你可以在Socketio“disconnect”中触发close事件作为解决方案

服务器

socket.on("disconnect", (reason)=>{
        socket.broadcast.emit("user-disconnected", userId); 
    });

客户

socket.on("user-disconnected", (userId)=>{
        // remove video or add your code here
   });

在发现我的 peerConnections 继续使用 chrome://webrtc-internals 发送流数据后,我 运行 陷入了这个问题。我目前正在使用 public peerjs 服务器。 MediaConnection does not fire the close event, but the DataConnection 仍然是 class。我的特定流程等待远程启动(数据)连接,然后开始呼叫。

我通过以下方式关闭了 MediaConnection:

  1. 打开到远程对等点的 DataConnection 和 MediaConnection
  2. 监控 MediaConnection 关闭事件
  3. 在作为 DataConnection 关闭处理程序的一部分后关闭所有 WebRTCpeerConnections

这看起来像:

function handlePeerDisconnect() {
  // manually close the peer connections
  for (let conns in peer.connections) {
    peer.connections[conns].forEach((conn, index, array) => {
      console.log(`closing ${conn.connectionId} peerConnection (${index + 1}/${array.length})`, conn.peerConnection);
      conn.peerConnection.close();

      // close it using peerjs methods
      if (conn.close)
        conn.close();
    });
  }
}

peer.on('connection', conn => {
    let call = peer.call(peerToCall, localStream);
   
    // peerjs bug prevents this from firing: https://github.com/peers/peerjs/issues/636
    call.on('close', () => {
        console.log("call close event");
        handlePeerDisconnect();
    });
}

    // this one works
    conn.on('close', () => {
        console.log("conn close event");
        handlePeerDisconnect();
    });
});