根据这篇文章,重新协商是在firefox v38中实现的,我们可以添加来自相同对等连接的删除流,而无需创建新的,但是我无法找到任何支持该声明的工作演示,当我尝试它时,两个用户聊天在视频模式下,我将其中一个流更改为audio,我得到错误:
NotSupportedError:尚未实现的removeStream
这告诉相同,但这种讲述重新协商事件的支持,而不是removeStream重新谈判的关键组成部分?我在Windows 7中使用firefox版本39.我很困惑,firefox尚不支持重新协商,对吧?
重新谈判是在Firefox的支持.
Firefox刚刚实施,removeStream因为规范已经改变,addTrack并且removeTrack在重新协商实施的时候(有些人暗示它的删除过于仓促,所以它可能会回来).addStream仍然适用于向后兼容性,因为Firefox已经支持它.
请注意,removeTrack混淆地返回RTCRtpSender,addTrack因此API不是插件.
polyfill看起来像这样:
mozRTCPeerConnection.prototype.removeStream = function(stream) {
this.getSenders().forEach(sender =>
stream.getTracks().includes(sender.track) && this.removeTrack(sender));
}
Run Code Online (Sandbox Code Playgroud)
移动到轨道是为了给用户更多的灵活性,因为轨道可能属于多个流,并且并非流中的所有轨道都需要通过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);
Run Code Online (Sandbox Code Playgroud)
另请注意,从您的第一个链接:
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));
});
});
}
Run Code Online (Sandbox Code Playgroud)
请注意,此示例调用pc1.addTracknotpc1.addStream
反之亦然,删除 - pc1.removeTrack:
function stopScreenShare() {
screenStream.stop();
screenSenders.forEach(sender) {
pc1.removeTrack(sender);
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2313 次 |
| 最近记录: |