WebRTC:firefox中的重新协商
根据this article,在firefox v38中实现了重新协商,我们可以从相同的peerconnections添加删除流而不创建新的流,但我无法找到任何工作演示来支持该声明,我试了一下,两个用户茶亭在视频模式下,我改变自己的信息流中的一个audio
,我得到的错误:WebRTC:firefox中的重新协商
NotSupportedError: removeStream not yet implemented
this告诉相同,但this告诉重新协商事件的支持,而不是removeStream
重新谈判的关键部分?我在Windows 7中使用firefox 39版。我很困惑,重新协商还没有在Firefox中支持,对吧?
尝试使用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);
});
}
重新协商是在Firefox中支持的。
火狐只是从来没有实现过removeStream
因为the spec已经被时间重新谈判是实现改为addTrack
和removeTrack
(有些是提示其去除是太匆忙,所以它可能会回来)。 addStream
仍然适用于向后兼容性,因为Firefox已经支持它。
请注意,removeTrack
易混淆需要从addTrack
返回RTCRtpSender所以API不是插入式。
一个填充工具将是这个样子:
mozRTCPeerConnection.prototype.removeStream = function(stream) {
this.getSenders().forEach(sender =>
stream.getTracks().includes(sender.track) && this.removeTrack(sender));
}
此举对轨道做的目的是为用户提供更大的灵活性,因为轨道可以属于多个数据流,而不是在一个流中的所有曲目需要送过来一个PeerConnection(或同一个PeerConnection)。
请参阅answer to a different question,了解适用于Firefox的重新协商示例。