我有一个非常简单的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内部仍然可以显示它。请帮助!
答案 0 :(得分:3)
你做得对。唯一缺少的是:
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对比,当我转到:webrtc(相当于chrome:// webrtc-internals)和点击刷新以及[清除历史记录]按钮时,我的对等连接已从列表中删除。