Firefox 支持重新协商。
Firefox 之所以没有实现 removeStream
是因为当重新协商被实现时,规范已经更改为使用 addTrack
和 removeTrack
(一些人认为它的删除过于草率,可能会回来)。由于 Firefox 已经支持了,所以 addStream
仍然可以用于向后兼容。
请注意,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。
replaceTrack
来替换单个音轨,而不是整个流。这个例子假设您有一个对等连接pc1
和一个新的流newStream
需要在其上进行替换。获取发送器,并用来自新流的适当音轨替换它们。工作示例在此处。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);
});
}