2017-01-29 4 views
1

メソッドhere iPhoneのシミュレータ(React Nativeを使用)からChromeブラウザで開始された音声コールに応答しようとしています。RTCPeerConnection.iceConnectionStateがチェックからクローズに変更されました

イベントシーケンスの概要:

  1. は、呼び出し信号
  2. を受け送っ
  3. が呼び出し信号
  4. は、PeerConnection
  5. 作成
  6. をリモート記述(申し出)を受けた参加ローカルストリームを得ました
  7. ローカルストリームを追加
  8. を受信しました
  9. 候補
  10. 7及び8を15回(すなわち、合計16倍)
  11. がトリガ
  12. signalingStateを有するリモート・オファーに
  13. を変更onaddstreamの
  14. コールバック関数をトリガonnegotiationneeded繰り返し添加setRemoteDescriptionが起動され、answerが作成されました。
  15. signalingStateは
  16. onicecandidateが初めてトリガーチェックに変え、安定
  17. iceconnectionstateに変更しました。
  18. は、2回目に誘発されたオニカンジン酸デヒドロゲナーゼから候補を放出した。 null
  19. iceconnectionstateがに変更された候補者が

を閉じてステップ7,8,9は6の後に別の場所で表示され、19

前に、私はかなりために、この問題に引っかかってきましたしばらく。私はこの時点で何をデバッグすべきかを知らない。接続の終了の原因は何ですか?必要に応じてさらにログを投稿することができます。

一つの観測はiceconnectionstatechangeに対応する2 RTCEventは、以下の性質を有していることである。

isTrusted:false

ターゲットRTCPeerConnectionはここ

iceConnectionState:"closed" 
iceGatheringState:"complete" 

がremoteOfferとremoteCandidatesを処理するために、私の機能であります

WebRTCClass.prototype.onRemoteOffer = function(data) { 
    var ref; 
    if (this.active !== true) { 
    return; 
    } 
    var peerConnection = this.getPeerConnection(data.from); 
    console.log('onRemoteOffer', data,peerConnection.signalingState); 

    if (peerConnection.iceConnectionState !== 'new') { 
    return; 
    } 
    var onSuccess = (function(_this){ 
    return function(){ 
     console.log("setRemoteDescription onSuccess function"); 
     _this.getLocalUserMedia((function(_this) { 
      return function(onSuccess,stream) { 
      peerConnection.addStream(_this.localStream); 
      var onAnswer = (function(_this) { 
       return function(answer) { 
       var onLocalDescription = function() { 
        return _this.transport.sendDescription({ 
        to: data.from, 
        type: 'answer', 
        ts: peerConnection.createdAt, 
        description: { 
         sdp: answer.sdp, 
         type: answer.type 
        } 
        }); 
       }; 
       return peerConnection.setLocalDescription(new RTCSessionDescription(answer), onLocalDescription, _this.onError); 
       }; 
      })(_this); 
      return peerConnection.createAnswer(onAnswer, _this.onError); 
      } 
     })(_this) 
    ); 
    } 
    })(this); 
    return peerConnection.setRemoteDescription(new RTCSessionDescription(data.description),onSuccess,console.warn); 
}; 

WebRTCClass.prototype.onRemoteCandidate = function(data) { 
    var peerConnection, ref; 
    if (this.active !== true) { 
    return; 
    } 
    if (data.to !== this.selfId) { 
    return; 
    } 
    console.log('onRemoteCandidate', data); 
    peerConnection = this.getPeerConnection(data.from); 
    if ((ref = peerConnection.iceConnectionState) !== "closed" && ref !== "failed" && ref !== "disconnected" && ref !== "completed") { 
    peerConnection.addIceCandidate(new RTCIceCandidate(data.candidate)); 
    } 
}; 
+0

Iは、[反応-ネイティブのWebRTCを(https://github.com/oney/react-native-webrtc)は、元のWebRTCパッケージからわずかに異なる動作と思われます。しかし、私はこれに非常に新しいので、私はwebrtcプロトコルの正しい軌跡に従っていない可能性もあります –

+0

シミュレータとブラウザは同じネットワークにありますか? createpeerconnectionでSTUNまたはTURNサーバーを使用していますか?あなたはiosまたはchrome libjingleログを持っていますか? – manishg

+0

シミュレータとブラウザは同じネットワーク(127.0.0.1)にあります。 peerconnectionは、STUNサーバを 'stun:stun.l.google.com:19302'に設定して作成されました。私はlibjingleログまたはそれを有効にする方法はよく分かりません。私は参考にしてもらえますか?私はコードで生成されたより詳細なログをいくつか持っています。 –

答えて

0

私は、私は次の2つの関数を一つずつ呼び出す場合、それが動作することがわかりました。

peerConnection.setRemoteDescription(new RTCSessionDescription(data.description),onSuccess,console.warn); 
(...definition of onAnswer ...) 
peerConnection.createAnswer(onAnswer, this.onError); 

私の以前のコードはsetRemoteDescriptiononSuccessコールバック内createAnswerと呼ばれます。これはreact-native-webrtcデモでは動作しましたが、Rocket.Chatでは動作しませんでした。まだそれを完全に理解していない。しかし、私のプロジェクトは今のところ進むことができます。

関連する問題