2015-02-11 75 views
1

我在寫一個webrtc應用程序,我無法使用涓流冰。所以我在等ICE候選人聚會完成並向其他同行發送優惠,以便ICE候選人被納入SDP。我爲onicegatheringstatechange設置了一個事件句柄,並等待iceGatheringState更改。但是這個事件沒有被觸發。onicegatheringstatechange事件不會在候選人收集期間觸發

pc = new RTCPeerConnection(peerConnectionConfig, peerConnectionConstraints); 
pc.onicegatheringstatechange = onIceGatheringStateChange; 

是否還有其他事情我必須做才能使其工作?

回答

1

不要等待onicegatheringstatechange被調用。

這是你應該做的事情:

  1. 使用onicecandidate函數接收冰候選人。
  2. 當您收到「null」事件時,您知道所有候選人都已收到。
  3. 如果未收到「空」事件通過定時器,則繼續進行調用。

這裏是你的代碼(使用它作爲唯一的一個模板)一個粗略的例子:因爲在你的事件

var timer; // Some globally accessible timer variable 
var state = "not sent"; // Keep track of call state 

pc.onicecandidate = function(event) { 

    if (!event.candidate) { 
    // last candidate received. Check if SDP was already sent. 
    if(state != "sent"){ 
     clearTimeout(timer); 
     // Send SDP to remote peer: 
     // Send pc.localDescription 
     // Change call state to "sent" 
    } 
    }else{ 
    // Start a timer for the max "wait" time for ice candidates. 
    timer = setTimeout(function(){ 
     // Ice gathering too slow, send SDP anyway. 
     // Send pc.localDescription 
     // Change call state to "sent" 
    }, 1000); 
    } 
} 

爲你與定時器使用onicecandidate事件是很重要的使用多臺Stun和Turn服務器,收冰過程可能需要幾秒鐘的時間,特別是在收到「空」事件之前。使用這種技術,您甚至可以在繼續調用之前等待特定數量的候選人,因爲您不需要所有候選人爲您的應用程序生成適當的SDP。還有一些方法可以通過在收到的每個候選冰塊之間啓動一個非常小的計時器來改進此方法。

在這個例子中,我設置了一個最大延遲1000ms的計時器,因爲我假設瀏覽器在這一點上已經收到了一個可接受的候選冰。您需要測試並瞭解什麼是最佳用戶體驗。

+0

謝謝@syno。我正在用你提到的方式去做。我被認爲是爲了這個目的而使用聚集的國家。 – prerak 2015-02-12 14:34:18