【问题标题】:Leaking RTCPeerConnections. Even after page refresh泄漏 RTCPeerConnection。即使在页面刷新之后
【发布时间】:2016-10-22 23:41:28
【问题描述】:

我有一个非常简单的 RTCPeerConnection 应用程序正在运行。使用 Firebase 发出信号。 RTCPeerConnections 建立,然后我获取流,并对其执行以下操作:

let streamURL = window.URL.createObjectURL(stream);

然后我将streamURL 设置为video.src = streamURL。这就是我如何看到远程用户的视频。然后,当我完成连接(我想结束对话)时,我会执行以下操作:

peerConnection.getLocalStreams().forEach(stream=>{
    stream.getTracks().forEach(t=>{
        t.stop();
        stream.removeTrack(t);
    });
});
peerConnection.close();

这将结束连接,包括关闭本地网络摄像头的绿灯。这告诉我,大部分事情已经结束了。

然后我检查chrome://webrtc-internals 并且连接仍然存在。即使在我刷新后,连接仍然存在。这似乎很奇怪。即使在刷新之后,它怎么可能仍然存在?请帮忙。我没有正确结束 RTCPeerConnection 吗?我认为这是正确的方法。我只是无法弄清楚 webrtc 内部如何即使在页面刷新后仍然可以显示它。请帮忙!

【问题讨论】:

  • stackoverflow.com/a/40210033/2885826 看看那个答案。它有助于如何正确创建流
  • 这是我的 Chrome。当你说页面刷新时,你是在刷新 chrome://webrtc-internals 页面,还是你的页面?
  • @jib 我正在刷新我的页面。不是 webrtc-internals 页面。

标签: javascript webrtc peer-connection


【解决方案1】:

你做得对。唯一缺少的是:

peerConnection = null;

让对等连接本身被垃圾收集。

正如我使用 mentioned elsewhere 一样,我会避免使用 createObjectURL 并直接使用 video.srcObject = stream,但如果您忘记停止所有轨道,这与释放相机有关。

我不会过多地阅读 Chrome 的 webrtc-internals 页面,因为查看对等连接对于调试很有用,即使事后也是如此。重要的问题是:是否有任何 JavaScript 或可观察到的连接打开的迹象?

示例

您可以在两个不同的选项卡或窗口中尝试this https fiddle,然后远程查看失败的情况。

确保您可以同时看到两个小提琴,然后单击其中一个中的 [开始!] 按钮进行连接。您应该在两个地方都看到视频。现在,当您单击 [停止!] 按钮时,您应该会在另一端看到以下输出(可能需要几秒钟才能显示全部三个):

disconnected
failed
closed

因为我检查了"failed" 状态并关闭了它的连接(尽管在生产中使用data channels to communicate hangups 更为常见)。

也就是说,我不会完全排除 Chrome 中的错误,因为它可能会比它应该更长时间地挂在资源上,因为我看到了你所描述的同样的事情(但请注意,例如“发送的数据包”当我点击“停止!”时下降到零,这是重要的部分)。

与 Firefox 相比,当我转到 about:webrtc(相当于 chrome://webrtc-internals)并点击刷新和 [清除历史记录] 按钮时,我的对等连接从列表中消失了。

【讨论】:

  • 这正是我想知道的。在尽我所能之后,我认为 webrtc-internals 必须被破坏或什么的。
  • 另外,将使用 srcObject 而不是我正在做的事情。感谢您的建议。这些太棒了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
相关资源
最近更新 更多