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设置为nulltransceiver.direction设置为recvonly(需要协商)。

发送方可以使用 sender.replaceTrack(newTrack) 重新发送数据并再次设置 transceiver.direction = "sendrecv"。在这种情况下,我们的 receiver.track 将再次 unmuted 并重新插入到流中,触发流上的 addtrack 事件。这也会再次触发 track 事件。浏览所有活动 in this blog 的互动部分。

接收轨道只有transceiver.stop()(本地或通过协商)真正ended,或pc.close()