WebRTC:在firefox中重新协商

mid*_*ido 6 firefox webrtc

根据这篇文章,重新协商是在firefox v38中实现的,我们可以添加来自相同对等连接的删除流,而无需创建新的,但是我无法找到任何支持该声明的工作演示,当我尝试它时,两个用户聊天在视频模式下,我将其中一个流更改为audio,我得到错误:

NotSupportedError:尚未实现的removeStream

告诉相同,但这种讲述重新协商事件的支持,而不是removeStream重新谈判的关键组成部分?我在Windows 7中使用firefox版本39.我很困惑,firefox尚不支持重新协商,对吧?

jib*_*jib 6

重新谈判在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中有效的重新协商示例,请参阅此答案.


xdu*_*ine 3

尝试用于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)