WebRTC:在firefox中重新协商

时间:2015-07-10 10:14:08

标签: firefox webrtc

根据this article,重新协商是在firefox v38中实现的,我们可以添加来自相同对等连接的删除流,而无需创建新的,但我无法找到任何支持该声明的工作演示,当我尝试过,两个用户在视频模式下聊天,我将其中一个流更改为audio,我收到错误:

  

NotSupportedError:removeStream尚未实现

this说明了相同的内容,但this告知重新协商事件是否得到支持,但重新协商的关键部分不是removeStream?我在Windows 7中使用firefox版本39.我很困惑,firefox尚不支持重新协商,对吧?

2 个答案:

答案 0 :(得分:6)

Firefox支持重新协商

Firefox从未实施removeStream因为the spec在重新协商实施时已更改为addTrackremoveTrack(有些人认为其删除过于仓促,所以它可能会回来)。 addStream仍可用于向后兼容,因为Firefox已经支持它。

请注意,removeTrack容易引起addTrack返回的RTCRtpSender,因此API不是插件。

polyfill看起来像这样:

mozRTCPeerConnection.prototype.removeStream = function(stream) {
  this.getSenders().forEach(sender =>
      stream.getTracks().includes(sender.track) && this.removeTrack(sender));
}

移动到曲目是为了给用户更多的灵活性,因为曲目可能属于多个流,而不是流中的所有曲目都需要通过PeerConnection(或相同的PeerConnection)发送。

有关在Firefox中有效的重新协商示例,请参阅此answer to a different question

答案 1 :(得分:3)

尝试将replaceTrack用于单个曲目,而不是替换整个流。此示例假定您具有要在其上替换的对等连接pc1和新流newStream。获取发件人,并用新流中的适当曲目替换曲目。工作样本here

Promise.all(pc1.getSenders().map(sender =>
  sender.replaceTrack((sender.track.kind == "audio")?
                      newStream.getAudioTracks()[0] :
                      newStream.getVideoTracks()[0])))
.then(() => log("Flip!"))
.catch(failed);

另请注意,从您的第一个链接:

function screenShare() {
    let screenConstraints = {video: {mediaSource: "screen"}};

    navigator.mediaDevices.getUserMedia(screenConstraints)
    .then(stream) {
        stream.getTracks().forEach(track) {
            screenStream = stream;
            screenSenders.push(pc1.addTrack(track, stream));
        });
    });
}

请注意,此示例调用pc1.addTrack而非pc1.addStream

反之,相反,删除 - pc1.removeTrack

function stopScreenShare() {
    screenStream.stop();
    screenSenders.forEach(sender) {
        pc1.removeTrack(sender);
    });
}