2016-02-23 36 views
4

我們正在使用WebRTC開發從移動設備到計算機的視頻流。移動設備可能完全失去連接,計算機應能夠檢測到該連接。現在,視頻只是凍結。但在這種情況下,都不會調用EventHandlers of RTCPeerConnection在WebRTC連接中檢測離線對等體

  • 那麼在另一個對等體上如何檢測到這種連接失敗?
  • 對端如何首先檢測連接建立的連接問題?

回答

8

iceconnectionstatechange處理程序應該在沒有從對等端接收數據(在Chrome中; Firefox正在處理該對象)約5-10秒後觸發。一個例子見https://webrtc.github.io/samples/src/content/peerconnection/states/

+0

謝謝。你對Firefox的看法是對的。在Chrome中,大約5秒後'oniceconnectionstatechange'被調用'currentTarget.iceConnectionState =='disconnected'',並且在5秒之後,相同的處理器被調用'currentTarget.iceConnectionState =='failed''。 – str

+0

回覆下面@MartinŽdila的評論,這也適用於Firefox。 – jib

8

如火狐一種解決方法,您可以使用getStats,以檢測數據包停止在未來:

var findStat = (m, type) => [...m.values()].find(s => s.type == type && !s.isRemote); 

var hasConnected = new Promise(resolve => pc.oniceconnectionstatechange = 
    e => pc.iceConnectionState == "connected" && resolve()); 

var hasDropped = hasConnected.then(() => new Promise(resolve => { 
    var lastPackets = countdown = 0, timeout = 3; // seconds 

    var iv = setInterval(() => pc.getStats().then(stats => { 
    var packets = findStat(stats, "inbound-rtp").packetsReceived; 
    countdown = (packets - lastPackets)? timeout : countdown - 1; 
    if (!countdown) resolve(clearInterval(iv)); 
    lastPackets = packets; 
    }), 1000); 
})); 

這裏有一個演示:https://jsfiddle.net/4rzhe7n8/

+1

偷偷摸摸的解決方案,謝謝。 – str

+0

這是一個很好的解決方案,但如果你不是一個絕對的JS破解,那麼這個解決方案几乎不可讀:-)但是,感謝你分享它。 – waldgeist

+0

@waldgeist,Hello函數式編程。 :)我寫它是一個插入式,你不能擊敗的大小。只要做'hasDropped.then(()=> log(「call dropped))'就可以使用它,但我不會說謊,我發現它比我經常在JavaScript上看到的頁面更具可讀性。在lisp比Java更好,es6讓我們更接近它的根源 – jib