Есть ли способ сообщить WebRTC о повторном вводе аудиосигнала после подключения аудиоустройства?
Ваш вопрос выглядит простым - симметрия с динамиками заманчива - но как только мыИмеется дело с пользователями, у которых есть несколько камер и микрофонов, это не так просто: если ваш пользователь отключает используемую Bluetooth-гарнитуру, следует ли вам подождать, пока он снова подключит его, или немедленно переключиться на микрофон своего ноутбука?Если последнее, вы переключаетесь обратно, если они подключат его позже?Это решения приложений.
API для обработки этих вещей: в основном окончено и devicechange события и метод replaceTrack () ,Вам также может понадобиться ограничение deviceId и метод enumerateDevices () для обработки нескольких устройств.
Однако, чтобы упростить задачу, давайте возьмем предположения в вашем вопросе за чистую монету, чтобы изучить API:
Когда пользователь отключает свой единственный микрофон (не свою камеру) во время разговора,наша работа состоит в том, чтобы возобновить разговор с ним, когда они вставляют его снова, без удаления видео:
- Сначала мы слушаем событие
ended
, чтобы узнать, когда падает наша локальная звуковая дорожка. - Когда это происходит, мы слушаем событие
devicechange
, чтобы обнаружить повторную вставку (чего угодно). - Когда это происходит, мы можем проверить, что изменилось, используя enumerateDevices () , или просто попробуйте getUserMedia снова (только на этот раз с микрофоном).
- Если это удастся, используйте
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
Выше приведен только для иллюстрации.Я уверен, что есть много угловых случаев для рассмотрения.