RTCPeerConnection媒体流在Firefox中工作,但不是chrome

时间:2014-09-30 02:11:36

标签: google-chrome google-chrome-extension webrtc

尽量让问题尽可能简单,我正在Chrome扩展中创建一个媒体流,如下所示:

var pc = new RTCPeerConnection(null);
chrome.desktopCapture.chooseDesktopMedia(['screen', 'window'], null, function(streamId) {
    var constraints = {
        audio: false,
        video: {
            mandatory: {
                chromeMediaSource: 'desktop',
                chromeMediaSourceId: streamId
            }
        }
    },
    success = function(stream) {
        pc.addStream(stream);
        pc.createOffer(function(offer) {
            pc.setLocalDescription(offer, function() {
                send('make_offer', name, offer);
            }, printError);
        }, printError);
    };
    getUserMedia(constraints, success, printError);
});

目前,我的优惠是由访问浏览器中的页面的同行收到的。这或多或少看起来像这样(m是带有报价的消息对象):

var pc = new RTCPeerConnection(null);
pc.onaddstream = function(e) {
    var video = document.getElementById('video');
    video.src = URL.createObjectURL(e.stream);
};
pc.setRemoteDescription(new RTCSessionDescription(m.value), function() {
    pc.createAnswer(function(answer) {
        pc.setLocalDescription(answer, function() {
            send('make_answer', m.from, answer);
        }, printError);
    }, printError);
}, printError);

我已经做过这个,无论是否有冰服务器,当我使用它们时看起来像这样:

var iceServers = {
    iceServers: [
        {url: 'stun:stun.l.google.com:19302'}
    ]
};

现在,对等体在Firefox中完美地接收并显示流。没问题。但它不适用于Chrome。以下是chrome:// webrtc-internals中的一些选定数据: 连接到firefox:

"ssrc_3309930214_send-transportId": {
 "startTime": "2014-09-30T01:41:11.525Z",
 "endTime": "2014-09-30T01:41:21.606Z",
 "values": "[\"Channel-video-1\",\"Channel-video-1\",\"Channel-video-1\"]"
},
"ssrc_3309930214_send-packetsLost": {
 "startTime": "2014-09-30T01:41:11.525Z",
 "endTime": "2014-09-30T01:41:21.606Z",
 "values": "[0,0,0,0,0,0,0]"
},

连接到chrome:

"ssrc_1684026093_send-transportId": {
 "startTime": "2014-09-30T01:41:57.310Z",
 "endTime": "2014-09-30T01:42:00.313Z",
 "values": "[\"Channel-audio-1\",\"Channel-audio-1\",\"Channel-audio-1\",\"Channel-audio-1\"]"
},
"ssrc_1684026093_send-packetsLost": {
 "startTime": "2014-09-30T01:41:57.310Z",
 "endTime": "2014-09-30T01:42:00.313Z",
 "values": "[-1,-1,-1,-1]"  // what is causing this??
},

那些似乎很重要,但我不确定其含义。我有更多的数据,但我不确定究竟什么是重要的。主要的想法是数据输出到firefox,但不是chrome,尽管没有例外,我可以看到。如果我在Chrome Canary(最新)中加载对等页面,则会发生另一个可疑数据:

Failed to load resource: net::ERR_CACHE_MISS

这是一个控制台错误,我不知道它来自哪里。它是在从对等方发送回主机(chrome扩展名)后发生的。

通过wss://完成信号,测试对等体托管在https:// 我不知道从哪里开始。

更新:根据回答和评论,我为onicecandidate添加了一个处理程序:

pc.onicecandidate = function(e) {
    console.log('This is the ice candidate.');
    console.log(e);
    if(!e.candidate) return console.warn('no candidate!');
    send('got_ice_candidate', name, e.candidate);
};

我还使用视频设置了从浏览器到浏览器的等效对等连接:

var constraints = {
    audio: false,
    video: true
};
getUserMedia(constraints, success, printError);

从Firefox到Chrome都可以正常使用,反之亦然,因此问题可能是特定于Chrome扩展程序的... 成功案例和扩展案例之间的聚集方式有所不同:

  • 在浏览器之间,根本没有冰。有一个事件,e.candidate是null
  • 从扩展程序到浏览器,有很多onicecandidate个事件。他们并非完全一致。那么也许chrome扩展会混淆STUN服务器?我不知道。

感谢您的回答,希望您有更多的洞察力。

1 个答案:

答案 0 :(得分:2)

你可以在双方加上处理冰候选人吗?

pc.onicecandidate = function(e){ send('ice_candidate', e.target) }

另一方面,收到此消息后,请执行

pc.addIceCandidate(new RTCIceCandidate(message));

即使已经交换了提供/回答的内容,Chrome也会发送冰候选者,而Firefox似乎并没有这样做。