簡體   English   中英

如何在不刷新頁面的情況下重置Chrome / node-webkit中的WebRTC狀態?

[英]How can I reset the WebRTC state in Chrome/node-webkit, without refreshing the page?

題:

如何重置Chrome中的WebRTC組件狀態 - 無需重新加載頁面 - 當它們被踢入無效狀態時如何? 有關我如何復制此狀態的詳細信息,請參閱下文,以及為什么我這樣問:

問題描述:

嘗試在撥打電話時設置Ice Candidates時,我在Chrome 35 / node-webkit 0.10.0中收到以下錯誤:

無法在“RTCPeerConnection”上執行“addIceCandidate”:無法添加ICE候選項。

現在,我知道為什么會這樣。 我正在制作一個可以處理一些普通用戶濫用的ROBUST WebRTC應用程序。 要復制這種狀態,我基本上必須進行一些WebRTC調用然后快速殺死它們然后立即嘗試另一個調用。 我猜這必須將PeerConnection和其他組件放到一個不同的狀態,在那里它會發生B,但我重新開始用A.這可以通過以下錯誤消息證明:

無法設置會話描述:無法設置遠程應答sdp:調用錯誤狀態:STATE_INIT

現在,我們在互聯網上看到的大多數WebRTC演示,如http://apprtc.appspot.com ,都是無狀態的,瀏覽器經常刷新,導致重置DOM狀態。 因此,對於那些開發人員來說,答案很簡單。 只需重新加載頁面並將其稱為好。

目前,我必須在DOM進入此狀態時重新加載應用程序。 但是,這不是一個可接受的解決方案,因為我正在構建單頁應用程序 ,而不是網站

我想知道是否有辦法調用API來告訴它重置拋出這些錯誤的狀態?

一些疑難解答步驟

我嘗試了以下命令,從node-webkit(Chrome 35)中的JavaScript控制台,看看我是否可以手動重置PeerConnection的狀態,但它沒有幫助:

 var properties = {};
 properties.pcConfig = {
     "iceServers": [{
         "url": "stun:stun.l.google.com:19302"
     }]
 };
 properties.pcConstraints = {
    "optional": []
 };

 peerConn = new RTCPeerConnection(properties.pcConfig, properties.pcConstraints);
 peerConn.close();

這是一些peerConnection屬性的輸出:

peerConn.signalingState     -->  "closed"
peerConn.iceConnectionState -->  "closed"
peerConn.iceGatheringState  -->  "complete"

您應該能夠回滾更改。 這只能在角色未更改時發生,即第一次調用中的調用者仍然是后續調用中的調用者,並且在您的情況下可能不合適,因為您獲得的錯誤消息與對等連接接收有關在發出要約之前的答案(即來電者/被叫者之間的不匹配)。

請注意,關閉狀態是最終狀態,應刪除關閉的對等連接,因為它無法重用。

在您的情況下,刪除原始對等連接並創建一個新連接是必須的,但還不夠。 您需要重新發起握手,並確保不會捕獲和使用針對原始對等連接的消息,並由其他對等連接使用。 多方客戶具有相同的設計問題。 解決它的一種方法,也是解決眩光問題的方法是添加到“提供”,“回答”,“候選”消息,您可以離線交換“原點”和可能的“目標”字段。 您必須自己生成ID,因為默認情況下對等連接對象沒有唯一ID。

這是正常的舞蹈(有涓流ICE):

  • A即將上線,創建對等連接,並在索引A_0的地圖中將其疼痛
  • B上線,與B_0相同(確保ID是唯一的)
  • A正在呼叫B.
    • 發送報價,附加字段“origin”:“A_0”和“target”:“B_0”
    • B收到offer,setLocalDescription(開始ICE收集),發送原始答案:B_0,target:A_0,Done。
    • 收到答案,設置本地描述(開始ICE收集),完成。
    • 正在與目標和原始領域進行適當交換的ICE候選人。

現在有問題的情況:

  • A在收到B的答案之前刪除其A_0對等連接。
  • B發送A_0的答案和ICE候選,由A丟棄,因為A_0不存在。
  • 用A_1重新開始舞蹈

眩光案例:

  • A和B同時發送報價
  • 比較ID並根據可重現的任意規則選擇一個(數字越大,字符串越大,使用字母順序......)

請注意,此設計還允許多方調用,因為每個調用都將由映射隔離,並由消息傳遞邏輯路由。

function handleGenericMsg(msg){
  if(  msg.origin  === username 
    ) {
    trace( 'MAIN - [' + username + '] Ignoring self message: ' + msg.type + '.' );
    return;
  }
  switch(msg.type){
    case 'offer':
      offerHandler(msg);
      break;
    default:
      trace( 'MAIN - [' + targetMid + '] Unsupported message received: ' +     JSON.stringify(msg));
      break;
  }
};

function offerHandler( msg ){
  var targetMid = msg.origin;
  offer = new RTCSessionDescription(msg);
  trace( 'PC   - [' + targetMid + '] Received offer.' )
  var pc = peerConnections[ targetMid ];
  if( !pc ) {
    openPeer( targetMid, false );
    pc = peerConnections[ targetMid ];
  } else {
    // we already had a PC, let's reuse it
  }
  pc.setRemoteDescription( offer );    
  doAnswer( targetMid );
};

暫無
暫無

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

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