根据this article,重新协商是在firefox v38中实现的,我们可以添加来自相同对等连接的删除流,而无需创建新的,但我无法找到任何支持该声明的工作演示,当我尝试过,两个用户在视频模式下聊天,我将其中一个流更改为audio
,我收到错误:
NotSupportedError:removeStream尚未实现
this说明了相同的内容,但this告知重新协商事件是否得到支持,但重新协商的关键部分不是removeStream
?我在Windows 7中使用firefox版本39.我很困惑,firefox尚不支持重新协商,对吧?
答案 0 :(得分:6)
Firefox支持重新协商 。
Firefox从未实施removeStream
因为the spec在重新协商实施时已更改为addTrack
和removeTrack
(有些人认为其删除过于仓促,所以它可能会回来)。 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);
});
}