Firefox需要一些用户媒体来进行WebRTC呼叫

时间:2019-06-26 15:37:14

标签: firefox webrtc

我有以下代码来创建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候选人存在一些问题。我有多个网络接口,一个用于Internet连接,另一个是WiFi热点,用于连接服务器。如果未建立连接(没有麦克风),则仅使用Internet连接的接口创建ICE候选对象。当我询问并允许使用麦克风时,具有WiFi热点的ICE候选者将因此创建并使用正确的IP。

似乎用户媒体和ice连接完全无关,但是只有不注释代码才能使它起作用。

我没有在服务器上进行任何ICE连接操作,并且提供的代码只是客户端上的js代码。

1 个答案:

答案 0 :(得分:3)

答案是,当您不授予摄像头或麦克风访问权限时,Chrome和Firefox仅会为您的网络接口之一提供ICE候选对象。如果您有权访问cam / mic,他们将为所有接口提供ICE候选对象。

现在,当他们只提供单个接口的地址时,他们需要选择要提供的接口。现在,Firefox将给出路由到8.8.8.8的接口的IP地址,因此基本上就是您的默认Internet上行链路。 Firefox开发人员正在研究改变这种行为,以给出从中加载页面的界面的IP地址,这应该可以解决您的用例。

我不确定为什么它可以在Chrome中使用。可能是因为Chrome记住您之前已获得共享摄像头/麦克风的权限。也许Chrome已经实现了与Firefox将要更改的逻辑相同的逻辑。您应该能够通过查看Chrome发放的ICE候选人来验证这一点。