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

如何检测何时在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(“统一计划”)中,发生这种情况时,我们的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事件。这也会再次触发oj​​it_code事件。探索所有事件in this blog的交互式部分。

接收曲目仅是track(本地或通过协商)或ended真正的transceiver.stop()

关于javascript - WebRTC:如何在Firefox中检测何时从PeerConnection中删除流或轨道?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60636439/

10-10 13:41