我尝试做一个简单的WebRTC p2p视频聊天浏览器应用程序。我设置了一个信号服务器,并有两个对等体做所有的SDP
和ICE
握手。我的一些代码片段:
pc = new RTCPeerConnection(config);
pc.onicecandidate = (event) => {
...
}
pc.ontrack(event) =>{
if (event.track.kind === 'video') {
// add the stream as the srcObject of a video tag
}
event.streams[0].onremovetrack = (e) => {
// want to remove the stream from the video tag
}
}
当一个peer完成后,我做以下操作:
pc.stop();
我只是关闭RTCPeerConnection。但是我没有看到onremovetrack
在另一个对等端被触发。
关闭对等体的正确方法是什么,以便可以通知另一个对等体并触发onremovetrack
?
我认为你应该使用RTCPeerConnection.removeTrack()
方法,它会在另一端触发MediaStream.onremovetrack
事件。
使用RTCPeerConnection.getSenders()
方法获取连接的轨迹。
RTCPeerConnection方法gesender()返回一个数组RTCRtpSender对象,每个对象表示RTP发送方负责传输一条轨道的数据。
let senders = pc.getSenders()
senders.forEach((sender) => {
pc.removeTrack(sender)
})
这将从连接中删除所有轨道。有一个完全关闭连接的实验方法,RTCPeerConnection.close()
,查看兼容性表。在删除音轨后使用它,这样您将获得onremovetrack
事件:
pc.close()
调用此方法将终止RTCPeerConnection的ICE代理,终止任何正在进行的ICE处理和任何活动流。
另一种方法是立即调用close()
方法,监听另一端的RTCPeerConnection.onconnectionstatechange
事件,查看示例。
更多信息
getSenders()
methodremoveTrack()
方法onremovetrack
事件处理器close()
方法onconnectionstatechange
事件处理程序