правильный разрыв WebRTC RTCPeerConnection

Я попытался сделать простое браузерное приложение для видеочата WebRTC p2p. Я настроил сигнальный сервер, и два одноранговых узла выполняют все рукопожатия SDP и ICE. Некоторые из моих фрагментов кода:

pc = new RTCPeerConnection(config);
pc.onicecandidate = (event) => {
 ...
}
pc.ontrack(event) =>{
  if (event.track.kind === 'video') {
    // add the stream as the srcObject of a video tag
  }
  event.streams[0].onremovetrack = (e) => {
    // want to remove the stream from the video tag
  }
}

Когда пир готов, я делаю следующее:

pc.stop();

Я просто закрываю RTCPeerConnection. Но я не вижу, чтобы onremovetrack срабатывал на другом узле.

Каков правильный способ выключения однорангового узла, чтобы другой одноранговый узел мог быть уведомлен и onremovetrack активирован?


person Joe Lin    schedule 08.02.2021    source источник


Ответы (1)


Я думаю, вы должны использовать метод RTCPeerConnection.removeTrack(), он вызовет событие MediaStream.onremovetrack на другом конце.

Чтобы получить треки соединения, используйте метод RTCPeerConnection.getSenders().

Метод RTCPeerConnection getSenders() возвращает массив объектов RTCRtpSender, каждый из которых представляет отправителя RTP, ответственного за передачу данных одной дорожки.

Пример

let senders = pc.getSenders()

senders.forEach((sender) => {
  pc.removeTrack(sender)
})

Это удалит все треки из соединения. Существует экспериментальный метод полного закрытия соединения, RTCPeerConnection.close(), проверьте таблица совместимости. Используйте его после удаления дорожек, так вы получите onremovetrack событий:

pc.close()

Вызов этого метода завершает работу агента ICE RTCPeerConnection, завершая любую текущую обработку ICE и любые активные потоки.

Альтернативный

Другой способ — немедленно вызвать метод close() и прослушать событие RTCPeerConnection.onconnectionstatechange на другом конце, проверить пример.

Дополнительная информация

person Tamas Szoke    schedule 08.02.2021