【问题标题】:Firefox requires some user media for WebRTC callFirefox 需要一些用户媒体才能进行 WebRTC 调用
【发布时间】:2019-11-08 14:46:45
【问题描述】:

我有以下代码来创建 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 候选只使用互联网连接的接口创建。当我询问并允许使用麦克风时,具有 WiFi 热点的 ICE 候选者会创建并使用正确的 IP。

似乎 usermedia 和 ice 连接是完全无关的,但只有取消注释代码才能工作。

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

【问题讨论】:

  • 检查 about:webrtc 中的 ice 连接网格,这有助于调试问题
  • 是的,通过检查我发现了我在帖子中描述的内容。

标签: firefox webrtc


【解决方案1】:

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

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

我不确定为什么它可以在 Chrome 中运行。要么是因为 Chrome 记得您之前已授予共享摄像头/麦克风的权限。或者 Chrome 已经实现了 Firefox 即将改变的相同逻辑。您应该能够通过查看 Chrome 分发的 ICE 候选者来验证这一点。

【讨论】:

  • 谢谢。但是麦克风是如何与 ICE 关联的呢?好吧 chrome,发送 2 个 ICE 用于 Internet 连接和 1 个 ICE 用于 wifi。
  • 它并没有真正关联。只是 ICE 网络部分需要一种方法来找出用户对给定页面的信任程度。如果您共享 cam/mic,则假定用户仅对他/她信任的页面执行此操作,因此可以共享更多 IP 地址。但是,如果用户没有授予对 cam/mic 的访问权限,则该页面的可信度会降低,因此默认情况下应该向该页面分配更少的 IP 地址。
  • HTTPS 有帮助吗?
  • 不,现在 Firefox 中根本没有代码可以告诉 ICE 堆栈从哪里加载页面。所以 HTTP 与 HTTPS 对这个问题无关紧要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-04
  • 2017-01-25
  • 2017-02-11
相关资源
最近更新 更多