Firefox需要一些用于WebRTC调用的用户媒体

Firefox需要一些用于WebRTC调用的用户媒体,firefox,webrtc,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) //

我有以下代码来创建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热点,服务器连接在这里。如果未建立连接(没有麦克风),则仅使用internet连接的接口创建ICE候选。当我请求并允许使用麦克风时,ICE将创建并使用WiFi热点,从而创建并使用正确的IP

看起来usermedia和ice连接是完全不相关的,但只有取消对代码的注释,它才能工作


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

答案是,当您不允许访问摄像头或麦克风时,Chrome和Firefox只会为您的一个网络接口提供ICE候选。如果您允许访问cam/mic,他们将为所有接口提供ICE候选接口

现在,当他们只给出单个接口的地址时,他们需要选择要给出的接口。现在Firefox会给出路由到8.8.8.8的接口的IP地址,所以基本上是默认的互联网上行。Firefox开发人员正在考虑改变这种行为,以给出页面加载界面的IP地址,这将修复您的用例


我不知道为什么它在Chrome中工作。或者是因为Chrome记得您之前已经授予共享您的摄像头/麦克风的权限。或者Chrome已经实现了Firefox即将改变的逻辑。您应该能够通过查看ICE候选用户Chrome分发的信息来验证这一点。

查看关于:webrtc中的ICE连接网格,这有助于调试问题是的,通过检查我找到了我在帖子中描述的内容。谢谢。但话筒与ICE有何关联?chrome,发送两个ICE用于互联网连接,一个ICE用于wifi。它实际上没有关联。只是ICE网络需要一种方法来确定用户对给定页面的信任程度。如果您共享cam/mic,则假定用户仅对其信任的页面共享,因此可以共享更多IP地址。但是,如果用户没有授予访问cam/mic的权限,则页面看起来不太可信,因此默认情况下,应该向页面提供较少的IP地址。HTTPS是否有帮助?不,目前Firefox中根本没有代码可以告诉ICE堆栈页面从何处加载。所以HTTP与HTTPS对这个问题并不重要。