2015-07-10 61 views
6

根據this article,在firefox v38中實現了重新協商,我們可以從相同的peerconnections添加刪除流而不創建新的流,但我無法找到任何工作演示來支持該聲明,我試了一下,兩個用戶茶亭在視頻模式下,我改變自己的信息流中的一個audio,我得到的錯誤:WebRTC:firefox中的重新協商

NotSupportedError: removeStream not yet implemented

this告訴相同,但this告訴重新協商事件的支持,而不是removeStream重新談判的關鍵部分?我在Windows 7中使用firefox 39版。我很困惑,重新協商還沒有在Firefox中支持,對吧?

回答

3

嘗試使用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); 
    }); 
} 
6

重新協商是在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的重新協商示例。