【问题标题】:webrtc is working on all browsers but not working on firefoxwebrtc 适用于所有浏览器,但不适用于 firefox
【发布时间】:2020-08-26 09:39:41
【问题描述】:

在任何事情之前!我已经检查了类似问题的所有答案,但答案既无用又陈旧。 我曾尝试在 Firefox 上使用 webrtc,但它没有用!并且没有给出错误!

此代码适用于除 firefox 以外的所有浏览器

这是我的代码

let configuration = {

        "iceServers":[{
            'url':'stun:stun.l.google.com:19302'
        }]

};


io.on("signaling_message",(data)=>{

    //displayMessage(data.message);
    if(!rtcPeerConn){
       startSignaling();
     }

     if(data.type!="user_here"){
         let message  = JSON.parse(data.message);
         if(message.sdp){
             rtcPeerConn.setRemoteDescription(new RTCSessionDescription(message.sdp),()=>{
                 if(rtcPeerConn.remoteDescription.type=="offer"){
                     rtcPeerConn.createAnswer(sendLocalDesc,logerror)
                 }
             })
         }else{

            rtcPeerConn.addIceCandidate(new RTCIceCandidate(message.candidate));
         }
     }

})

function startSignaling(){
    displayMessage("start signaling...");
  rtcPeerConn = new RTCPeerConnection(configuration);
 //send ice candidate to other peer
        rtcPeerConn.onicecandidate  = function(evt){
            if(evt.candidate){
                io.emit("signal",{"type":"ice candidate","message":JSON.stringify({'candidate':evt.candidate}),room:signal_room})
                displayMessage("completed that ice candidate");
            }
        }
rtcPeerConn.onnegotiationneeded = function(){
    displayMessage("on negotiationnneded");
    rtcPeerConn.createOffer(sendLocalDesc,logerror);

}
rtcPeerConn.onaddstream = (evt,err)=>{
    displayMessage("creating  the other stream");
    if(err){
        displayMessage(err)
    }
    success2(evt.stream);
}

navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;

        navigator.mediaDevices.getUserMedia({video:true,audio:true}).then(stream=>{
             success(stream);
             rtcPeerConn.addStream(stream);
        }).catch(err=>{
             logerror(err);
            });

}


function sendLocalDesc(desc){

rtcPeerConn.setLocalDescription(desc,()=>{
displayMessage("set local description");
io.emit("signal",{type:"SDP",message:JSON.stringify({'sdp':rtcPeerConn.localDescription}),room:signal_room})


},logerror);

}


     function success(stream){
        if ("srcObject" in video) {
        video.srcObject = stream;
        } else {
        // Avoid using this in new browsers, as it is going away.
        video.src = window.URL.createObjectURL(stream);
        }

        video.play();
        }




        function success2(stream){
        if ("srcObject" in video2) {
        video2.srcObject = stream;
        } else {
        // Avoid using this in new browsers, as it is going away.
        video2.src = window.URL.createObjectURL(stream);
        }


        video2.play();
        }

我的代码有什么问题吗?

另一个问题,我可以在生产中使用 google stun iceservers 吗?他们可靠吗?

编辑

firefox 卡在这个脚本上

  rtcPeerConn.onicecandidate  = function(evt){
            if(evt.candidate){
                io.emit("signal",{"type":"ice candidate","message":JSON.stringify({'candidate':evt.candidate}),room:signal_room})
                displayMessage("completed that ice candidate");
            }
        }

它像循环一样不断显示此消息(完成了那个冰候选)

【问题讨论】:

    标签: javascript html webrtc


    【解决方案1】:

    你有没有申请webrtc-adapter?

    而且 google stun 服务器不适用于生产。

    因为如果您的客户端位于 NAT 或防火墙之后,P2P 连接是不可能的。

    如果 WebRTC 中的 P2P 连接失败,则必须准备 TURN 服务器进行中继。

    例如,您可以使用coTURN

    【讨论】:

    • 谢谢,但是我在导入适配器后并没有感觉到任何变化。你能检查一下(编辑)部分吗?火狐浏览器卡在(rtcPeerConn.onicecandidate)
    • 也许是个线索
    • 我还有一个问题,如何使用适配器?我应该包括它吗?我没有找到任何使用方法的文档
    • 适配器是垫片。你需要做的就是在你的脚本之前插入它。像这样:
    • 我认为您的配置可能有误。修复后可以测试吗? >> { iceServers: [{ urls: "stun:stun.l.google.com:19302" }] 不是“url”,而是“urls”。 url 属性已过时
    猜你喜欢
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 2016-02-17
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    相关资源
    最近更新 更多