WebRTC:Firefox 中的重新协商

6
根据这篇文章,Firefox v38中实现了重新协商,我们可以向同一对等连接添加或删除流而无需创建新连接,但我找不到任何工作演示来支持该说法,当我尝试在视频模式下与两个用户聊天时,我将其中一个流更改为音频,我遇到以下错误:

NotSupportedError:removeStream尚未实现

这里描述的也是同样的问题,但这里描述重新协商事件被支持,但removeStream不是重新协商的重要部分吗?我在Windows 7上使用Firefox版本39。我很困惑,Firefox还没有支持重新协商,对吗?
2个回答

6

Firefox 支持重新协商。

Firefox 之所以没有实现 removeStream 是因为当重新协商被实现时,规范已经更改为使用 addTrackremoveTrack(一些人认为它的删除过于草率,可能会回来)。由于 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。


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);

此外,请注意,来自您提供的第一个链接中的以下内容:
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);
    });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接