WebRT C 'playoutDelayHint' автоматически синхронизирует все треки - PullRequest
0 голосов
/ 02 августа 2020

Я написал простое приложение, которое передает поток от одного мастера нескольким клиентам. Поскольку мастер может использовать что-то вроде IP-веб-камеры (имеет ~ 1se c латентность), но внутренний микрофон (без задержки), я хотел добавить задержку на аудиодорожку. К сожалению, кажется, что задержка не работает на Firefox, а на chrome она автоматически синхронизирует все треки с самым высоким значением playoutDelayHint. Так что все задерживается на одну секунду. Я проверил значения обоих потребительских RTPreceivers для обеих дорожек, только аудио установило playoutDelayHint на одну секунду, которая не меняется со временем, но после нескольких секунд потоковой передачи видео тоже задерживается на одну секунду.

const stream = new MediaStream;
    [...]
let el = document.querySelector('#remote_video');
    [...]
function addVideoAudio(consumer) {
  if (consumer.kind === 'video') {
      el.setAttribute('playsinline', true);
      consumer._rtpReceiver.playoutDelayHint = 0;
  } else {
      el.setAttribute('playsinline', true);
      el.setAttribute('autoplay', true);
      consumer._rtpReceiver.playoutDelayHint = 1;
  }
    stream.addTrack(consumer.track.clone());
    el.srcObject = stream;
    el.consumer = consumer;
}

Даже когда я добавляю еще один видеоэлемент и другой медиапоток, поэтому каждый поток (потребитель) получает свой собственный html элемент, я все равно получаю тот же эффект:

const stream1 = new MediaStream;
const stream2 = new MediaStream;
    [...]
let el1 = document.querySelector('#remote_video');
let el2 = document.querySelector('#remote_audio');
    [...]
function addVideoAudio(consumer) {
  if (consumer.kind === 'video') {
      el1.setAttribute('playsinline', true);
      consumer._rtpReceiver.playoutDelayHint = 0;
      stream1.addTrack(consumer.track);
      el1.srcObject = stream1;
      el1.consumer = consumer;
  } else {
      el2.setAttribute('playsinline', true);
      el2.setAttribute('autoplay', true);
      consumer._rtpReceiver.playoutDelayHint = 1;
      stream2.addTrack(consumer.track);
      el2.srcObject = stream2;
      el2.consumer = consumer;
  }
}

Можно ли отложить только одну дорожку и почему работает только задержка (вроде) на chrome? Заранее спасибо. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...