WebRTC:如何检测流或曲目何时从 Firefox 中的 PeerConnection 中删除?
WebRTC: how to detect when a stream or track gets removed from a PeerConnection, in Firefox?
onremovestream
已弃用(并从 Firefox 中删除),而 onremovetrack
尚未在 Firefox 中实现。
如何检测 Firefox 中的流或曲目何时被删除?
您在接收 流上使用 onremovetrack
:
pc.ontrack = ({track, streams: [stream]}) => {
track.onunmute = () => {
if (!video.srcObject) video.srcObject = stream;
};
stream.onremovetrack = ({track}) => {
console.log(`${track.kind} track was removed.`);
if (!stream.getTracks().length) {
console.log(`stream ${stream.id} emptied (effectively removed).`);
}
};
};
上面的 ontrack
将 运行 例如对方添加轨道(并协商):
const sender = pc.addTrack(track, stream);
现在,每当另一方调用 pc.removeTrack(sender)
或设置 transceiver.direction = "recvonly"
(并协商)时,您应该会看到 removetrack
事件触发。
这是一个应该适用于所有浏览器的example。
注意事项
在标准 WebRTC ("unified-plan") 中,当发生这种情况时,我们的 transceiver.receiver.track
不是 ended
,因为它连接到另一方的 transceiver.sender
,而不是另一方边的transceiver.sender.track
.
我们的接收曲目没有结束,而是 muted
并从其流中删除。
这是因为pc.removeTrack(sender)
只将sender.track
设置为null
,transceiver.direction
设置为recvonly
(需要协商)。
发送方可以使用 sender.replaceTrack(newTrack)
重新发送数据并再次设置 transceiver.direction = "sendrecv"
。在这种情况下,我们的 receiver.track
将再次 unmuted
并重新插入到流中,触发流上的 addtrack
事件。这也会再次触发 track
事件。浏览所有活动 in this blog 的互动部分。
接收轨道只有transceiver.stop()
(本地或通过协商)真正ended
,或pc.close()
。
onremovestream
已弃用(并从 Firefox 中删除),而 onremovetrack
尚未在 Firefox 中实现。
如何检测 Firefox 中的流或曲目何时被删除?
您在接收 流上使用 onremovetrack
:
pc.ontrack = ({track, streams: [stream]}) => {
track.onunmute = () => {
if (!video.srcObject) video.srcObject = stream;
};
stream.onremovetrack = ({track}) => {
console.log(`${track.kind} track was removed.`);
if (!stream.getTracks().length) {
console.log(`stream ${stream.id} emptied (effectively removed).`);
}
};
};
上面的 ontrack
将 运行 例如对方添加轨道(并协商):
const sender = pc.addTrack(track, stream);
现在,每当另一方调用 pc.removeTrack(sender)
或设置 transceiver.direction = "recvonly"
(并协商)时,您应该会看到 removetrack
事件触发。
这是一个应该适用于所有浏览器的example。
注意事项
在标准 WebRTC ("unified-plan") 中,当发生这种情况时,我们的 transceiver.receiver.track
不是 ended
,因为它连接到另一方的 transceiver.sender
,而不是另一方边的transceiver.sender.track
.
我们的接收曲目没有结束,而是 muted
并从其流中删除。
这是因为pc.removeTrack(sender)
只将sender.track
设置为null
,transceiver.direction
设置为recvonly
(需要协商)。
发送方可以使用 sender.replaceTrack(newTrack)
重新发送数据并再次设置 transceiver.direction = "sendrecv"
。在这种情况下,我们的 receiver.track
将再次 unmuted
并重新插入到流中,触发流上的 addtrack
事件。这也会再次触发 track
事件。浏览所有活动 in this blog 的互动部分。
接收轨道只有transceiver.stop()
(本地或通过协商)真正ended
,或pc.close()
。