2017-01-08 55 views
4

我正在使用webRTC打開2個用戶之間的數據通道,網站的簡化版本是: 1按鈕用onclick =「myLive.initiateConnection()」創建調用。
1使用id =「呼叫者」爲SDP描述輸入到從第一用戶選項卡中複製粘貼到第二的用戶
1個按鈕與的onclick =接聽電話「myLive.join()」
1輸入id =「callee」,用於從第二個用戶複製粘貼到第一個用戶的SDP描述
1 onclick =「setCallee($('#callee')。val())」遠程描述重刑第一用戶
在webRTC調用中設置接收器

我把initiateConnection方法之前加入的方法,因爲如下所述,我認爲錯誤是由被稱爲gotCallerInfo加入:

join = function(){ 
connection = new peerConnection(servers); 
    connection.onicecandidate = function(evt){ 
     if(evt.candidate){ 
      connection.addIceCandidate(new RTCIceCandidate(event.candidate)); 
     } 
    }; 

    connection.ondatachannel = function(ev){ 
     dataChannel = ev.channel; 
     dataChannel.onmessage = receiveMessage; 
      ev.channel.onopen = function(){ 
       alert('connection established, callee'); 
      }; 
     }; 
     gotCallerInfo($("#caller").val()) 
    }; 

gotCallerInfo = function(data){ 
    var newDesc = JSON.parse(data); 
    connection.setRemoteDescription(new RTCSessionDescription(newDesc), function(){ 
     connection.createAnswer(function(desc){   
      connection.setLocalDescription(desc); 

此代碼沒有按」通過webRTC連接2個用戶。通過調整此處的代碼並使用chrome進行測試,我發現我可以通過兩次單擊加入按鈕來實現我的webRTC調用...或者在等待1s()後第二次調用createAnswer,webRTC調用與chrome 。但與Firefox,它會觸發錯誤「createAnswer無法在狀態穩定中調用」。爲什麼在超時之後第二次調用createAnswer人爲地解決了chrome問題(不幸的是沒有使用firefox)?我想我按照錯誤的順序做了一些事情,但setRemoteDescription,createAnswer和setLocalDescription的順序是正確的。由第二個createAnswer創建的Desc2比由第一個創建的desc長,所以我懷疑setLocalDescription觸發了一些需要發送給調用者的ICE候選者的集合,在這種情況下,我怎樣才能得到desc是一個完整的描述第一次調用createAnswer?

  //setTimeout(function(){ 
       //connection.createAnswer(function(desc){   
        $("#callee").val(JSON.stringify(desc)); 
       //}, errorCallback); 
      //}, 1000); 
     }, errorCallback); 
    }, errorCallback); 
}; 

我把調用者使用的代碼放在錯誤源自錯誤本身之前的情況下。調用者通過單擊創建按鈕來運行initiateConnection方法。然後被叫複製粘貼從主叫標籤的說明,然後點擊加入,那麼調用者複製粘貼由被叫方的說明,然後單擊設置被叫描述

initiateConnection = function(){ 
    connection = new peerConnection(servers); 
    connection.onicecandidate = function(evt){ 
     if(evt.candidate){ 
     connection.addIceCandidate(new RTCIceCandidate(event.candidate)); 
     } 
    }; 

    dataChannel = connection.createDataChannel("channel"); 
    dataChannel.onopen = function(){ 
     alert('connection established, caller'); 
    }; 
    dataChannel.onmessage = receiveMessage; 
    connection.createOffer(function(description){ 
     connection.setLocalDescription(description); 
     $("#caller").val(JSON.stringify(description)); 
    }, errorCallback); 
}; 

setCallee = function(data){ 
    connection.setRemoteDescription(new RTCSessionDescription(JSON.parse(data))); 
}; 

receiveMessage = function(){}; 

errorCallback = function(){}; 
+0

太多這裏剖析。你真的需要把它分解成[mcve]。不太清楚爲什麼你需要長時間輪詢 – charlietfl

+0

好吧,我要編輯一個版本,其中服務器和ajax調用被複制粘貼從一個標籤描述到另一個 –

回答

1

兩個問題:

connection.onicecandidate = function(evt){ 
    if(evt.candidate){ 
    connection.addIceCandidate(new RTCIceCandidate(event.candidate)); 

在這裏,您將同一個peerConnection添加回候選項,將其短路。不要這樣做。

當然,使用cut'n'paste而不是發信號,你不需要涓滴候選人。相反,在複製要約或答案之前,請忽略候選人並簡單地等待null候選人。考生隨着時間的推移會自動添加到本地報價/答案中。 null表示該進程的結束,在某些情況下(可能會出現在VPN,VM,多個網卡等中),該進程可能需要1秒鐘時間從<到大約20秒。

順便說一句,這可能是爲什麼等一秒鐘就讓它爲你工作。

有關工作cut'n'paste例如,見WebRTC, ice candidates connection

+0

謝謝,而不是添加候選人回來了,我通過檢查evt.candidate是否爲空並根據提議向發送者發送connection.localDescription來替換它。它的工作原理,如果在某些情況下過程可能需要長達20秒,我不需要經常超時 –