如何销毁RTCPeerConnection?

时间:2018-08-26 18:44:43

标签: javascript webrtc rtcpeerconnection

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

var peer = new RTCPeerConnection();

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

我想稍后销毁该对象。怎么做?我尝试过

peer.close();

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

如果我未设置变量,例如

peer=false;

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

释放RTCPeerConnection对象的正确方法是什么?我问是因为如果我不释放它们,有时会因为使用太多它们而被Web浏览器拒绝创建新的RTCPeerConnection。

2 个答案:

答案 0 :(得分:0)

实际上

peer.close();

是正确的方法。

您还可以执行以下操作:

peer.close();
peer = null;

以下是原始WebRTC代码示例的摘要:

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

答案 1 :(得分:0)

您要销毁哪个事件? 您的代码中可能缺少一部分,使连接保持打开状态 这是一本完整的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上的bug,也会导致内存泄漏,不确定此bug是否仍然存在。

用户退出时的另一件事,例如关闭浏览器窗口 如果我们仍处于“提供”,“答案”或“候选”状态

  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"); 
  });