Firefox需要一些用于WebRTC调用的用户媒体
我有以下代码来创建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) //
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对这个问题并不重要。