【发布时间】: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 连接网格,这有助于调试问题
-
是的,通过检查我发现了我在帖子中描述的内容。