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