WebRTC:在firefox中重新协商

WebRTC:在firefox中重新协商,firefox,webrtc,Firefox,Webrtc,据介绍,firefox v38中实现了重新协商,我们可以从相同的对等连接中添加或删除流,而无需创建新的对等连接,但我找不到任何工作演示来支持这一说法,当我尝试时,两个用户在视频模式下聊天,我将其中一个流更改为音频,我发现错误: NotSupportedError:尚未实现removeStream 说明相同,但说明支持重新协商事件,但removeStream不是重新协商的关键部分吗?我在Windows7中使用firefox版本39。我很困惑,firefox还不支持重新协商,对吗?尝试对单个曲目使用

据介绍,firefox v38中实现了重新协商,我们可以从相同的对等连接中添加或删除流,而无需创建新的对等连接,但我找不到任何工作演示来支持这一说法,当我尝试时,两个用户在视频模式下聊天,我将其中一个流更改为
音频
,我发现错误:

NotSupportedError:尚未实现removeStream


说明相同,但说明支持重新协商事件,但
removeStream
不是重新协商的关键部分吗?我在Windows7中使用firefox版本39。我很困惑,firefox还不支持重新协商,对吗?

尝试对单个曲目使用
replaceTrack
,而不是替换整个流。本例假设您有一个对等连接
pc1
,并有一个新的流
newStream
在其上进行替换。获取发送者,并用新流中的适当曲目替换曲目。工作样本

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

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.卸下支架

function stopScreenShare() {
    screenStream.stop();
    screenSenders.forEach(sender) {
        pc1.removeTrack(sender);
    });
}
Firefox支持重新协商

Firefox从未实施过
removeStream
,因为在实施重新协商时,Firefox已更改为
addTrack
removeTrack
(有些人认为其删除过于仓促,因此可能会再次出现)
addStream
仍然可以向后兼容,因为Firefox已经支持它了

请注意,
removeTrack
容易混淆地获取从
addTrack
返回的数据,因此API不是一个插入

polyfill的外观如下所示:

mozRTCPeerConnection.prototype.removeStream = function(stream) {
  this.getSenders().forEach(sender =>
      stream.getTracks().includes(sender.track) && this.removeTrack(sender));
}
移动到曲目是为了给用户更大的灵活性,因为曲目可能属于多个流,并且一个流中的所有曲目都不需要通过PeerConnection(或同一PeerConnection)发送

有关在Firefox中工作的重新协商示例,请参见此

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