WebRTC:如何在 Firefox 中检测何时从 PeerConnection 中删除流或轨道?

Dan*_*ari 8 javascript stream webrtc peer-connection

onremovestream已被弃用(并从 Firefox 中删除),而onremovetrack尚未在 Firefox 中实现。

如何检测 Firefox 中的流或轨道何时被删除?

jib*_*jib 7

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).`);
    }
  };
};
Run Code Online (Sandbox Code Playgroud)

ontrack当例如另一方添加轨道(并协商)时,上面将运行:

const sender = pc.addTrack(track, stream);
Run Code Online (Sandbox Code Playgroud)

现在,每当另一方呼叫pc.removeTrack(sender)或设置transceiver.direction = "recvonly"(并协商)时,您应该看到removetrack事件触发。

这是一个适用于所有浏览器的示例

要记住的事情

在标准 WebRTC(“统一计划”)中,发生这种情况时我们transceiver.receiver.track不是ended,因为它连接到transceiver.sender另一方的transceiver.sender.track.

我们的接收轨道没有结束,而是muted从其流中移除。

这是因为pc.removeTrack(sender)只设置sender.tracktonulltransceiver.directionto recvonly(需要协商)。

发送方因此可以再次使用sender.replaceTrack(newTrack)和设置来恢复发送数据transceiver.direction = "sendrecv"。在这种情况下,我们receiver.trackunmuted再次插入到流中,触发addtrack流上的事件。这也会track再次触发该事件。在此博客的互动部分探索所有事件。

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