【问题标题】:How to destroy RTCPeerConnection properly in JavaScript?如何在 JavaScript 中正确销毁 RTCPeerConnection?
【发布时间】:2018-08-28 12:47:27
【问题描述】:

当我创建new RTCPeerConnection() 时,据我所知,我无法使用 peer.close() 将其销毁,并且一段时间后我的资源耗尽。当网页创建大量RTCPeerConnections 时,它会在大约 600 次尝试后停止工作,并在 Chrome 中抛出以下错误:

未捕获的 DOMException:无法构造“RTCPeerConnection”:无法创建这么多 PeerConnections

这是一个测试脚本,可以帮助您解决错误。这只是说明性的,即使对等点的创建速度要慢得多,也会出现问题:

var i = 1;

function peer() {
  var peer = new RTCPeerConnection();
  setTimeout(() => {
    peer.close();
    peer=null;
  }, 10);
  console.log(i++);
}

setInterval(peer, 20);
// run the script and wait on console to see the error

我希望它在调用 peer.close() 时释放所有资源,或者至少在 peer 设置为 null 时释放所有资源,所以我认为浏览器没有理由抛出有这么多 PeerConnections 的错误。我做错了什么吗?如何正确销毁对等体?谢谢

【问题讨论】:

  • 您的间隔计时器大约每 16 毫秒运行一次,但关闭连接的超时等待 400 毫秒。因此,随着时间的推移,您创建的连接比关闭的连接多 25 倍。为什么您会期待看到的结果之外的任何其他结果?
  • 你为什么要这样做?你在负载测试什么吗? :)
  • @Pointy 超时没有区别。我已经编辑了示例代码,它还是失败了
  • @Nisarg Shah:这只是说明行为的示例代码
  • 由于 Mozilla 的关闭是实验性的,它可能无法正常工作,请跟踪可以一次打开的数量,如果需要更多,请使用 websockets。此外,Mozilla 表示使用 Adapter.js 可能会更好。

标签: javascript webrtc rtcpeerconnection


【解决方案1】:

尝试将 peer 设置为 null,以便收集垃圾。请参阅实施限制的人的these notes。如果这不起作用,请在该邮件列表线程中询问

【讨论】:

  • 它在 chrome 和 firefox 上为我工作尝试剪掉我的答案,它是否与你分手?
【解决方案2】:

好的,这是一个令人困惑的谜团,幸运的是它已经解决了,我会试着给你一个例子,这样任何读过这篇文章的人都可以理解到底发生了什么。

假设您已经构建了自己的程序,该程序可以计算单个文件夹中的文件,并且您命令该程序计算文件夹 C:\Files 中的文件

该文件夹路径包含 500 个文件。 该程序最多需要 1 小时来读取 500 个文件,这是他的最大能力,所以你给他命令并按 Enter 键。

一小时后,你回来看到程序是(Dead),你调查什么问题?然后你会发现,由于他每小时读取500个文件的最大能力和有500个文件的文件夹,他不可能出错,但是错误出现了,因为有人一直在这个文件夹上扔文件,就像无限循环一样,它就像他需要 1 秒来读取一个文件,并且在同一秒内还有 5 个文件以累积方式出现 他开始计数,同时对新文件进行累积计数。

这正是您的情况所发生的事情,chrome 浏览器在一秒钟内关闭了对等连接,而在这一秒内,您向他抛出了 3-4 个新的对等连接,这使得 chrome 浏览器在标记错误之后在控制台上,因为控制台后台的计算表明这是无穷大的,它迟早会显示堆栈错误。其中一部分是您通过使用这些值设置间隔时间来淹没浏览器缓存。

我已经追踪了将近三个小时,这就是我最终得到的结果。 我将很快编辑这篇文章并添加有关如何解决它的解决方案。

好的,我刚刚完成了代码的调整,下面是我运行 snip 代码的结果,如果您在 chrome 控制台上看到错误,请告诉我 注意:您可以删除 sip java-script,我用它来跟踪您的错误。

希望我的帖子将来能对某人有所帮助。

祝你好运

 <script src="http://sipjs.com/download/sip-0.7.2.min.js"></script>

 <meta http-equiv="Expires" content="0">
 <meta http-equiv="Pragma" content="no-cache">
 <meta http-equiv="Cache-control" content="no-cache">
 <meta http-equiv="Cache" content="no-cache">
 <script>



  var i = 1;

  function peer() {

  var peer = new RTCPeerConnection();
   
  peer.mediaHandler = null;
  peer.onicecandidate = null; 
  peer.onaddstream = null; 

  peer.close(i);

  setTimeout(() => {

  console.log('Ending Call');

  }, 3500);
  console.log(i++);



  }

 setInterval(peer, 500);


  hangUp = () => {
    let { peer} = this.state;
 
    peer.close();

 
    this.setState({
        peer: null,
      
   
    });
};




</script>

【讨论】:

  • 为什么要包含 sip.js ? hangUp() 函数是从哪里调用的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2011-04-06
  • 2017-01-20
  • 1970-01-01
  • 2020-11-07
  • 1970-01-01
相关资源
最近更新 更多