簡體   English   中英

即使我沒有在同伴候選人中添加冰候選人,Webrtc Call也會連接

[英]Webrtc Call gets connected even if I'm not adding ice candidate in peer candidate

const pc1 = new RTCPeerConnection(null);
const pc2 = new RTCPeerConnection(null);
async function call(){
    const offer = await pc1.createOffer();
    pc1.setLocalDescription(offer);
    pc2.setRemoteDescription(offer);
    const answer = await pc2.createAnswer();
    pc2.setLocalDescription(answer);
    pc1.setRemoteDescription(pc2.localDescription);
}
async function showVideo(){
    const config={audio:true,video:true};
    stream = await navigator.mediaDevices.getUserMedia(config);
    pc1.addStream(stream);
}

這是我的代碼的簡化版本。

現在在這段代碼中,我沒有向同伴添加icecandidate,也沒有收聽onicecandidate。 但是如果我兩次調用call(),我的連接就會建立起來。

我使用事件處理程序進行iceconnectionstate更改,發現當我第一次調用調用時,iceconnection狀態處於檢查狀態,當我第二次調用它時,它被調用並且狀態變為完成狀態。

所以我想知道即使不向另一個同伴添加icecandidate如何啟動檢查並第二次連接?

有四個原因:代碼中的錯誤,Chrome的行為,沒有防火牆,以及ICE如何工作。

1)代碼中的錯誤

首先要做的事情:以下設置pc1.setRemoteDescription(null)

pc2.setLocalDescription(answer);
pc1.setRemoteDescription(pc2.localDescription); // pc2.localDescription == null here

...因為setLocalDescription是一個不能立即完成的異步方法

現在pc2.localDescription確實最終得到了設置,所以你第二次調用call()它就在那里,並且協商工作。

為了解決這個問題,你必須在等待承諾使用awaitthen

await pc2.setLocalDescription(answer);
pc1.setRemoteDescription(pc2.localDescription); // pc2.localDescription is set!

2)如果沒有NAT,則不需要ICE服務器。

瀏覽器可以使用“主機”候選(機器的IP)與同一LAN上的其他計算機或自身進行通信。 沒有ICE服務器需要發現它們。

3)Trickle ICE是一種優化。

使用onicecandidate的單個冰候選者的信令(滴流)是用於加速協商的優化。 一旦setLocalDescription成功,瀏覽器的內部ICE代理就會啟動,將ICE候選項(如發現它們)插入localDescription本身。 等待幾秒鍾進行協商,根本不需要滴流:所有ICE候選人都將在報價和答案中傳送。

4)Chrome中一個有趣的行為。

我懷疑第二次調用call()時的比賽call() Chrome的ICE代理會記住上次收集的主機候選人,並在setLocalDescription的成功回調運行完成之前立即將它們插入到商品和localDescription 可能是一個錯誤,或者可能是規范說應該如何工作。 在任何情況下,行為似乎根據瀏覽器atm而有所不同,所以今天我不會依賴它。

在SDP中重現/證明ICE的步驟

  1. 在Chrome和Firefox中運行這個小提琴
  2. 點擊Call! 按鈕一次,然后再一次。
  3. 觀察Firefox:你會看到0 candidates (輸出兩次); 兩次; 沒聯系。
  4. 觀察Chrome:它與3 candidates 第二 3 candidates 候選人聯系。
  5. 現在取消注釋// await wait(2000);
  6. 兩個瀏覽器現在連接,2秒后有48 candidates

實際候選人數可能因您的系統而異,但行為不應該。

當我在Firefox中運行它時,它不會連接任何時間,除非我修改它以等待或涓流候選人)。

瀏覽器更新: 兩個瀏覽器都有錯誤:Firefox 限制性太強 ,Chrome在從ICE故障中恢復過於寬松

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM