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.addTrackpc1.addStream

,并在反向相同,去除 - pc1.removeTrack

function stopScreenShare() { 
    screenStream.stop(); 
    screenSenders.forEach(sender) { 
     pc1.removeTrack(sender); 
    }); 
} 

重新协商是在Firefox中支持的

火狐只是从来没有实现过removeStream因为the spec已经被时间重新谈判是实现改为addTrackremoveTrack(有些是提示其去除是太匆忙,所以它可能会回来)。 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的重新协商示例。