WebRT C: как определить, когда поток или дорожка удаляются из PeerConnection, в Firefox? - PullRequest
5 голосов
/ 11 марта 2020

onremovestream устарел (и удален из Firefox), в то время как onremovetrack еще не реализован в Firefox.

Как определить, когда поток или дорожка удаляются в Firefox

1 Ответ

2 голосов
/ 26 марта 2020

Вы используете 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.

Вот пример , который должен работать во всех браузерах.

Что нужно иметь в виду

В стандартном WebRT C ("унифицированный план") наш 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 снова. Изучите все события в интерактивном разделе этого блога.

Трек получения действительно только ended на transceiver.stop() (локально или через переговоры) или pc.close().

...