【问题标题】:Firefox doesn't create an offer: Cannot create an offer with no local tracks, no offerToReceiveAudio/Video, and no DataChannelFirefox 不创建报价:无法创建没有本地曲目、没有 offerToReceiveAudio/Video 和没有 DataChannel 的报价
【发布时间】:2016-11-19 18:13:28
【问题描述】:

我在使用 Firefox 时遇到问题。此代码在 Chrome 中完美运行。

function create_offer() {
    pc = new peer_connection({iceServers: [
        {urls: "stun:stun.l.google.com:19302"}
    ]});
    //pc.createDataChannel('channel');

    pc.createOffer(
        create_offer_success,
        create_offer_error,
        setSdpConstraints()
    );

    pc.onaddstream = on_add_stream;
    pc.onicecandidate = on_ice_candidate;
}

function create_offer_success(desc) {
    pc.setLocalDescription(desc);
}

function create_offer_error(error) {
    console.error("create_offer_error() error:", error);
}

function on_ice_candidate(event){
    if (event.candidate) {
        ice.push(event.candidate);
    } else {
        return send('/offer', {
            'id': id,
            'desc': pc.localDescription,
            'ice': ice
        })
        .then(function(data) {
            return pc.setRemoteDescription(new session_description(data.desc), function() {
                for(var i = 0, l = data.ice.length; i < l; i++) {
                    pc.addIceCandidate(new ice_candidate(data.ice[i]));
                }
                return data;
             }, function(err) {
                console.error(err);
            });
        })
        .catch(function(err) {
            console.error('on_ice_candidate() catch: ', err);
        });
    }
}

function on_add_stream(event) {
    console.log(event);
    stream = event.stream;
    var vid = document.getElementById("stream");
    if(isFirefox) {
        vid.mozSrcObject = stream;
    } else {
        vid.src = URL.createObjectURL(stream)
    }
}

function setSdpConstraints() {
    return !!navigator.mozGetUserMedia && firefoxVersion > 34 ?
    {
        OfferToReceiveAudio: true,
        OfferToReceiveVideo: true
    } :
    {
        optional: [],
        mandatory: {
            OfferToReceiveAudio: true,
            OfferToReceiveVideo: true
        }
    };
}

Firefox 显示错误:无法创建没有本地曲目、没有 offerToReceiveAudio/Video 和没有 DataChannel 的报价。 火狐版本是44。 我做错了什么?

【问题讨论】:

    标签: javascript firefox webrtc


    【解决方案1】:

    您为 Firefox 设置了错误的约束:

    {
        OfferToReceiveAudio: true,
        OfferToReceiveVideo: true
    }
    

    您需要设置的内容(Chrome 从 Chrome 38 开始也支持此设置)应该是:

    {
        offerToReceiveAudio: 1,
        offerToReceiveVideo: 1
    }
    

    注意大小写差异。

    【讨论】:

      【解决方案2】:

      Philipp Hancke 的答案是正确的,在 mediacontraints 中有一个案例问题。

      为了简化约束配置,您可以像这样合并 Chrome 和 Firefox 约束:

      var mediaConstraints = {
          mandatory: {
              'OfferToReceiveAudio': true,
              'OfferToReceiveVideo': true
          },
          'offerToReceiveAudio': true,
          'offerToReceiveVideo': true    
      };
      

      这将允许您在 Chrome 和 Firefox 上使用相同的代码创建优惠:

      if (typeof RTCPeerConnection === "undefined") {
      	RTCPeerConnection = window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
      }
      	
      var pcConfig = {"iceServers": [] };
      var pc = new RTCPeerConnection(pcConfig);
      
      var mediaConstraints = {
          mandatory: {
              'OfferToReceiveAudio': true,
              'OfferToReceiveVideo': true
          },
          'offerToReceiveAudio': true,
          'offerToReceiveVideo': true    
      };
      pc.createOffer(function(session) { alert("Create offer ok"); }
                   , function(error)   { alert("Create offer error:" + error);  }
                   , mediaConstraints); 				

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-16
        • 2011-01-20
        • 1970-01-01
        • 2020-05-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多