WebRTC — Замена дорожек RTCPeerConnection увеличивает задержку потоковой передачи на стороне получателя на несколько минут

#google-chrome #firefox #webrtc

#google-chrome #firefox #webrtc

Вопрос:

Чтобы иметь возможность плавно переключаться с передней камеры на заднюю и наоборот во время установленного RTCPeerConnection, я использовал RTCRtpSender.replaceTrack() API следующим образом:

 replaceMediaTracks = (mediaTracks: MediaStreamTrack[]) => {
  if (!mediaTracks || mediaTracks.length < 1) {
    throw this.errorFactory.createError('Failed to replace media tracks of RTC PC: No track to replace provided.');
  }
  this.peerConnections.forEach((peerConnection) => {
    peerConnection.pc.getSenders().forEach((sender) => {
      mediaTracks.forEach((track) => {
        if (track.kind === sender.track.kind) {
          sender.replaceTrack(track);
        }
      });
    });
  });
};
  

Я заметил, что на стороне приемника видео и аудиопоток будут воспроизводиться с некоторой дополнительной задержкой в течение короткого периода времени (прибл. от 1 до 2 минут) всякий раз, когда я заменяю дорожки. При поиске причины я выяснил, что jitterBufferDelay / jitterBufferEmittedCount, похоже, связано с этим феноменом, поскольку оно также увеличивается синхронно:

введите описание изображения здесь

Есть ли какой-либо способ избежать задержки потока при замене дорожек, поскольку это приводит к ухудшению работы пользователя?

— Обновление и решение от 2020-09-06 —

Я также испытывал вышеупомянутую задержку видеопотока на стороне приемника в Firefox. Это может означать, что и в Firefox, и в Chrome есть ошибка. Я еще не создал сообщение об ошибке, поскольку я не уверен, ошибка это или нет. Тем не менее, я попытался сделать свою реальную цель переключения видео с передней камеры на заднюю и наоборот немного более эффективной, заменив только видеопоток вместо замены как видео, так и аудиопотока. С точки зрения кода это означает, что я вызываю replaceMediaTracks следующим replaceMediaTracks(stream.getVideoTracks()) образом вместо replaceMediaTracks(stream.getTracks()) . Поток извлекается предыдущим вызовом navigator.mediaDevices.getUserMedia(...) , и вуаля, задержка больше не возникает:

введите описание изображения здесь

Я несколько раз переключал видеопоток между 19: 24 и 19:27, и в соотношении jitterBufferDelay / jitterBufferEmittedCount существенных изменений нет.

Так что это решение, которое полностью подходит для моего варианта использования.

Комментарии:

1. файл с ошибкой Chrome, это ненормальное поведение…

2. Это хороший момент, спасибо. Чтобы убедиться, что это происходит только с Chrome, я собираюсь также протестировать это с Firefox. Если этого не происходит, я собираюсь создать ошибку.

3. Привет, @PhilippHancke, такая же проблема возникает и в Firefox, что не дает мне понять, ошибка это или нет. Но я нашел решение, которое отлично подходит для моего варианта использования (см. Обновление в моем исходном сообщении).