У меня есть следующий код для создания соединения 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 на клиенте.