【问题标题】:How to destroy RTCPeerConnection?如何销毁 RTCPeerConnection?
【发布时间】:2018-08-26 18:44:43
【问题描述】:

我可以使用以下代码创建一个新的对等连接对象:

var peer = new RTCPeerConnection();

发生这种情况时,chrome 会将其显示为 chrome://webrtc-internals/ 中的新连接对象

我想稍后销毁这个对象。怎么做?我试过了

peer.close();

但这似乎没有任何作用,因为 peer 变量仍然是 RTCPeerConnection 类型,我仍然可以看到它在 chrome://webrtc-internals/ 中处于活动状态。

如果我取消设置变量,比如

peer=false;

它仍然在chrome://webrtc-internals/ 中显示。然而,如果我关闭网页,它会立即从 chrome://webrtc-internals/ 中消失。

释放 RTCPeerConnection 对象的正确方法是什么?我之所以问,是因为如果我不释放它们,我偶尔会被网络浏览器拒绝创建新的 RTCPeerConnection,因为它们太多了。

【问题讨论】:

    标签: javascript webrtc rtcpeerconnection


    【解决方案1】:

    其实

    peer.close();
    

    是一种正确的方法。

    你也可以这样做:

    peer.close();
    peer = null;
    

    这是来自原始 WebRTC 代码示例的一些 sn-ps:

    function hangup() {
      console.log('Ending call');
      pc1.close();
      pc2.close();
      pc1 = null;
      pc2 = null;
      hangupButton.disabled = true;
      callButton.disabled = false;
    }
    

    https://github.com/webrtc/samples/blob/gh-pages/src/content/peerconnection/pc1/js/main.js#L175

    【讨论】:

    • 谢谢你。我意识到即使在使用 .close() 时我仍然在 chrome://webrtc-internals/ 中看到许多连接,它也会将它们识别为已关闭,但会在一段时间后将它们从列表中删除
    【解决方案2】:

    你想在哪个事件上销毁它? 您的代码中可能缺少使连接保持打开状态的部分 这是一本完整的 PDF 书,解释了 WebRtc 如何在浏览器上工作,

    click here to download it

    我将这本书交给你,这样你就可以检查你的代码中是否有任何部分使连接在这种情况下处于打开状态,即使你在特定事件上关闭了对等点,它仍然会显示并保持打开状态浏览器。

    至于您的问题,假设您想通过单击按钮将其关闭,我们称之为挂断按钮, //挂断

    hangUpBtn.addEventListener("click", function () { 
    
    send({ 
      type: "leave" 
    });
    
    handleLeave(); 
    });
    
    function handleLeave() { 
    connectedUser = null; 
    remoteVideo.src = null; 
    
    yourConn.close(); 
    yourConn.onicecandidate = null; 
    yourConn.onaddstream = null; 
    };
    

    当用户断开连接时,您应该清理其连接。您可以在触发关闭事件时删除用户。将以下代码添加到连接处理程序

    connection.on("close", function() { 
    if(connection.name) { 
     delete users[connection.name]; 
    } 
    });
    

    当用户单击挂起按钮时,它会向其他用户发送“离开”消息它会关闭 RTCPeerConnection 并在本地销毁连接

    这应该关闭 rtc 连接,据我所知,即使您关闭了连接,chrome 上也存在错误,它会导致内存泄漏,不确定此错误是否仍然存在。

    用户退出时的另一件事,例如关闭浏览器窗口 如果我们仍处于“offer”、“answer”或“candidate”状态,这可能会有所帮助

      connection.on("close", function() { 
    
      if(connection.name) { 
      delete users[connection.name]; 
    
      if(connection.otherName) { 
      console.log("Disconnecting from ", connection.otherName); 
      var conn = users[connection.otherName]; 
      conn.otherName = null;  
    
      if(conn != null) { 
      sendTo(conn, { 
      type: "leave" 
      }); 
      }  
      } 
      } 
      });  
    
      connection.send("Hello world"); 
      }); 
    

    【讨论】:

    • 我不完全理解你为什么删除用户[某事],因为我的代码中没有这样的变量。我也没有任何 send() 函数。也许你正在考虑使用一些 rtc 框架?
    • 我假设您正在建立 2 个用户用户 A 和用户 B 之间的连接,因此当其中任何一个单击按钮挂断时,您应该删除用户 A 和 B 的连接。通过删除连接,我正在使用 send { type : leave } 通知其他用户有关断开连接的信息,您能否提供有关您在应用程序上使用对等点的位置的更多详细信息?
    • 你能分享你有问题的页面的整个代码吗?
    猜你喜欢
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    相关资源
    最近更新 更多