google-chrome - RTCPeerConnection 媒体流在 firefox 中工作但在 chrome 中不工作

标签 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 服务器?我不知道。

感谢您的回答,希望您能提供更多见解。

最佳答案

你能在两侧添加处理冰候选吗?

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

在收到这条“消息”的另一边做

pc.addIceCandidate(new RTCIceCandidate(message));

即使在交换了提议/答案之后,Chrome 也会发送 ice candidates,而 firefox 似乎不会这样做。

关于google-chrome - RTCPeerConnection 媒体流在 firefox 中工作但在 chrome 中不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26111693/

相关文章:

ruby - 错误 SSL 协议(protocol)错误 : ERROR bad URI

javascript - Chrome 不遵守 z-index 顺序

javascript - 如何获取 url 中的特定参数并将其添加到 Chrome 扩展中的另一个 url 中?

javascript - 如何将信息从 Content_script 传递到弹出页面? (Chrome 扩展)

ios - 根据宽高比缩放视频 View

webrtc - Trickle ICE - 选择候选人

java - Java Applet 使用 Chrome 浏览器启动客户端程序的替代方案是什么?

html - 使用 CSS 样式透视图时切换选项卡会破坏背景图像

google-chrome-extension - 如何在 dart 中使用 chrome.webRequest API

javascript - 对来自网络摄像头的 h264 流进行编码