WebRT C смена микрофона или веб-камеры во время разговора - PullRequest
1 голос
/ 21 апреля 2020

Я пытаюсь выяснить, как изменить микрофон или веб-камеру , пока вы находитесь в видеочате с кем-то.


Я пытался в течение нескольких дней и ничего не работает Я следовал этому примеру , но, кажется, гораздо сложнее добиться изменения, пока кто-то уже подключен.

У меня есть проблемы: Если я изменю mi c звук потерян / ми c вообще не реагирует. Я также не могу изменить его обратно на значение по умолчанию.

Аналогичная вещь происходит, если я меняю веб-камеру. Поток зависает, последний кадр виден.

Я не получаю сообщения об ошибке, фактически он сообщает, что изменения были успешными.

Смена веб-камеры / mi c РАБОТАЕТ до установления вызова


Вот соответствующий кодовый блок. Везде, где я читаю, просто создайте новые ограничения и задайте нужный идентификатор устройства для потока аудио / видео.:

function ChangeDevice() {

  if (localStream) {
    localStream.getTracks().forEach(track => {
      track.stop();
    });
  }

  var audioSource = audioInputSelect.value;
  var videoSource = videoSelect.value;

  console.log(videoSource);
  console.log(audioSource);

  const newConstraints = {
    audio: {deviceId: audioSource ? {exact: audioSource} : undefined},
    video: {deviceId: videoSource ? {exact: videoSource} : undefined}
  };

  navigator.mediaDevices.getUserMedia(newConstraints).then(gotStream).then(gotDevices).catch(handleError);
}

function gotStream(stream) {

  console.log('Adding local stream.');
  localStream = stream;
  localVideo.srcObject = stream;
  sendMessage(['got user media', room]);
  if (isInitiator) {
    maybeStart();
  }
  return navigator.mediaDevices.enumerateDevices(); // I added this

}

Я думаю, что эти две функции являются соответствующими, ChangeDevice вызывается, когда я выбираю новое устройство из падать. Идентификаторы верны.

Вот весь код, который я использую:

pastebin.com / 6JrK4jJD

1 Ответ

0 голосов
/ 23 апреля 2020

К счастью replaceTrack теперь работает во всех браузерах, поэтому нет необходимости пересматривать.

Мне пришлось отредактировать мою функцию gotStream следующим образом:

function gotStream(stream) {

  // If already started
  // Need this if webcam or mic changes
  if (isStarted) {
    var videoTrack = stream.getVideoTracks()[0];
    var audioTrack = stream.getAudioTracks()[0];

    var sender = pc.getSenders().find(function(s) {
      return s.track.kind == videoTrack.kind;
    });

    var sender2 = pc.getSenders().find(function(s) {
      return s.track.kind == audioTrack.kind;
    });

    console.log('found sender:', sender);
    sender.replaceTrack(videoTrack);
    sender2.replaceTrack(audioTrack);

    localStream = stream;
    localVideo.srcObject = stream;

  } else {
    console.log('Adding local stream.');
    localStream = stream;
    localVideo.srcObject = stream;
    sendMessage(['got user media', room]);
    if (isInitiator) {
      maybeStart();
    }
  }

  return navigator.mediaDevices.enumerateDevices(); // I added this

}
...