【问题标题】:WebRTC: how to detect when a stream or track gets removed from a PeerConnection, in Firefox?WebRTC:如何在 Firefox 中检测流或轨道何时从 PeerConnection 中删除?
【发布时间】:2020-03-11 12:49:38
【问题描述】:

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

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

【问题讨论】:

  • 如果用户离开房间,则对等连接关闭,这将触发 oniceconnectionstatechange 和 onsignalingstatechange 事件,iceConnectionState 和 signalingState 都将“关闭”。
  • 这是正确的。但是,在用户离开房间和实际触发 oniceconnectionstatechange(有时)之间,我得到了一致的延迟。
  • @DanieleMolinari 请更新您的问题,详细说明您要解决的问题。从您的评论看来,您正在尝试检测远程对等点丢失,这与协商离开轨道无关(这就是 onremovestream 的用途)。
  • @jib 我的问题最初包括“如何检测用户何时离开房间”部分。由于@Karthik 就在oniceconnectionstatechange 上,因此我将其从问题中删除。我要解决的是用户添加多个视频流,然后删除一个的情况。

标签: javascript stream webrtc peer-connection


【解决方案1】:

你在接收上使用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 设置为nulltransceiver.direction 设置为recvonly(需要协商)。

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

接收轨道仅由transceiver.stop()(本地或通过协商)或pc.close() 提供真正的ended

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 2021-08-27
    • 2014-01-10
    • 2013-05-22
    相关资源
    最近更新 更多