отключение и переподключение аудиоустройства webrtc - PullRequest
0 голосов
/ 01 марта 2019

У меня есть приложение для видеозвонков на основе WebRTC.Это работает, как ожидалось.Однако, когда происходит вызов, если я отсоединяю и подключаю аудиоустройство (микрофон + динамик), работает только часть динамика.Кажется, что микрофонная часть не работает - другая сторона больше не может слышать.

Есть ли способ сообщить WebRTC о повторном вводе аудиосигнала после подключения аудиоустройства?

1 Ответ

0 голосов
/ 05 марта 2019

Есть ли способ сообщить WebRTC о повторном вводе аудиосигнала после подключения аудиоустройства?

Ваш вопрос выглядит простым - симметрия с динамиками заманчива - но как только мыИмеется дело с пользователями, у которых есть несколько камер и микрофонов, это не так просто: если ваш пользователь отключает используемую Bluetooth-гарнитуру, следует ли вам подождать, пока он снова подключит его, или немедленно переключиться на микрофон своего ноутбука?Если последнее, вы переключаетесь обратно, если они подключат его позже?Это решения приложений.

API для обработки этих вещей: в основном окончено и devicechange события и метод replaceTrack () ,Вам также может понадобиться ограничение deviceId и метод enumerateDevices () для обработки нескольких устройств.

Однако, чтобы упростить задачу, давайте возьмем предположения в вашем вопросе за чистую монету, чтобы изучить API:

Когда пользователь отключает свой единственный микрофон (не свою камеру) во время разговора,наша работа состоит в том, чтобы возобновить разговор с ним, когда они вставляют его снова, без удаления видео:

  1. Сначала мы слушаем событие ended, чтобы узнать, когда падает наша локальная звуковая дорожка.
  2. Когда это происходит, мы слушаем событие devicechange, чтобы обнаружить повторную вставку (чего угодно).
  3. Когда это происходит, мы можем проверить, что изменилось, используя enumerateDevices () , или просто попробуйте getUserMedia снова (только на этот раз с микрофоном).
  4. Если это удастся, используйте await sender.replaceTrack(newAudioTrack) для отправки нашего нового аудио.

Это может выглядеть так:

let sender;

(async () => {
  try {
    const stream = await navigator.mediaDevices.getUserMedia({video: true, audio: true});
    pc.addTrack(stream.getVideoTracks()[0], stream);
    sender = pc.addTrack(stream.getAudioTracks()[0], stream);
    sender.track.onended = () => navigator.mediaDevices.ondevicechange = tryAgain;
  } catch (e) {
    console.log(e);
  }
})();

async function tryAgain() {
  try {
    const stream = await navigator.mediaDevices.getUserMedia({audio: true});
    await sender.replaceTrack(stream.getAudioTracks()[0]);
    navigator.mediaDevices.ondevicechange = null;
    sender.track.onended = () => navigator.mediaDevices.ondevicechange = tryAgain;
  } catch (e) {
    if (e.name == "NotFoundError") return;
    console.log(e);
  }
}

// Your usual WebRTC negotiation code goes here

Выше приведен только для иллюстрации.Я уверен, что есть много угловых случаев для рассмотрения.

...