[英]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如何工作。
首先要做的事情:以下設置pc1.setRemoteDescription(null)
:
pc2.setLocalDescription(answer);
pc1.setRemoteDescription(pc2.localDescription); // pc2.localDescription == null here
...因為setLocalDescription
是一個不能立即完成的異步方法 。
現在pc2.localDescription
確實最終得到了設置,所以你第二次調用call()
它就在那里,並且協商工作。
為了解決這個問題,你必須在等待承諾使用await
或then
:
await pc2.setLocalDescription(answer);
pc1.setRemoteDescription(pc2.localDescription); // pc2.localDescription is set!
瀏覽器可以使用“主機”候選(機器的IP)與同一LAN上的其他計算機或自身進行通信。 沒有ICE服務器需要發現它們。
使用onicecandidate
的單個冰候選者的信令(滴流)是用於加速協商的優化。 一旦setLocalDescription
成功,瀏覽器的內部ICE代理就會啟動,將ICE候選項(如發現它們)插入localDescription
本身。 等待幾秒鍾進行協商,根本不需要滴流:所有ICE候選人都將在報價和答案中傳送。
我懷疑第二次調用call()
時的比賽call()
Chrome的ICE代理會記住上次收集的主機候選人,並在setLocalDescription
的成功回調運行完成之前立即將它們插入到商品和localDescription
。 這可能是一個錯誤,或者可能是規范說應該如何工作。 在任何情況下,行為似乎根據瀏覽器atm而有所不同,所以今天我不會依賴它。
Call!
按鈕一次,然后再一次。 0 candidates
(輸出兩次); 兩次; 沒聯系。 3 candidates
第二 次 與3 candidates
候選人聯系。 // await wait(2000);
4
或8 candidates
。 實際候選人數可能因您的系統而異,但行為不應該。
當我在Firefox中運行它時,它不會連接任何時間,除非我修改它以等待或涓流候選人)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.