Firefox требует пользовательского мультимедиа для вызова WebRTC - PullRequest
1 голос
/ 26 июня 2019

У меня есть следующий код для создания соединения WebRTC. Я хочу только один поток от сервера к вызывающей стороне.

const RTCCon = new RTCPeerConnection({});

WS = new WebSocket(`ws://${location.host}`);
WS.onmessage = e => {
        const data = JSON.parse(e.data);

        RTCCon.setRemoteDescription(data)
                // .then(() =>
                //         window.navigator.mediaDevices.getUserMedia({
                //                 audio: true,
                //                 video: false
                //         })
                // )
                .then(() => RTCCon.createAnswer())
                .then(answer => RTCCon.setLocalDescription(answer))
                .then(() => {
                        WS.send(
                                JSON.stringify({
                                        type: "answer",
                                        sdp: RTCCon.localDescription.sdp
                                })
                        );
                        const video = document.getElementsByTagName("video")[0];
                        video.muted = true;
                        video.autoplay = true;
                        video.srcObject = new MediaStream(RTCCon.getReceivers().map(receiver => receiver.track));
                });
};


Этот код работает с Chrome, но не работает с Firefox. Когда я откомментирую закомментированную часть с помощью window.navigator.mediaDevices.getUserMedia и разрешу использовать микрофон в браузере, выполняется подключение, и все работает.

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

Похоже, что пользовательские медиа и ледяные соединения совершенно не связаны, но только раскомментирование кода заставляет его работать.

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

1 Ответ

3 голосов
/ 26 июня 2019

Ответ таков: когда вы не предоставляете доступ к камере или микрофону, Chrome и Firefox будут выдавать только кандидатов ICE для одного из ваших сетевых интерфейсов. Если вы предоставили доступ к cam / mic, они будут выдавать кандидатов ICE для всех интерфейсов.

Теперь, когда они выдают адрес только для одного интерфейса, им нужно выбрать, какой интерфейс выдавать. И прямо сейчас Firefox выдаст IP-адрес интерфейса, который перенаправляется на 8.8.8.8, так что в основном это ваш интернет-канал связи по умолчанию. Разработчики Firefox пытаются изменить это поведение, чтобы выдавать IP-адрес интерфейса, с которого была загружена страница, что должно исправить ваш случай использования.

Я не уверен, почему это работает в Chrome. Либо потому, что Chrome помнит, что вы ранее дали разрешение на совместное использование вашей камеры / микрофона. Или, может быть, в Chrome уже реализована та же логика, на которую собирается перейти Firefox. Вы сможете убедиться в этом, взглянув на кандидатов ICE, которые Chrome раздает.

...