2015-05-11 4 views
0

Ответ сервера:не может добавить удаленное описание сеанса в WebRTC андроида клиента

{ 
    "rtcid": "wKAm8eeyI-mQ5dsslkhu", 
    "msgType": "offer", 
    "senderrtcid": "53wp_LP5CYDie3eIlkhw", 
    "msgData": { 
     "type": "offer", 
     "sdp": "v=0\r\no=- 951920257545056255 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE audio video\r\na=msid-semantic: WMS OfkjcHABgxUkHlk8mfJ8ayYZdCHqdpQGFSTM\r\nm=audio 1 RTP/SAVPF 111 103 104 0 8 106 105 13 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:1 IN IP4 0.0.0.0\r\na=ice-ufrag:CF4q+RW54gQVPaz0\r\na=ice-pwd:hEIbgX4MME6cPkZKGih7bjQM\r\na=ice-options:google-ice\r\na=fingerprint:sha-256 1E:7F:B8:BA:1A:8D:76:BE:A9:A5:A3:9D:59:3E:CC:BD:1B:90:7B:89:EF:F0:03:B3:9A:CA:9C:07:02:97:53:6F\r\na=setup:actpass\r\na=mid:audio\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=sendrecv\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=fmtp:111 minptime=10\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:106 CN/32000\r\na=rtpmap:105 CN/16000\r\na=rtpmap:13 CN/8000\r\na=rtpmap:126 telephone-event/8000\r\na=maxptime:60\r\na=ssrc:777379316 cname:Dl+cb/nGYCzEcTvH\r\na=ssrc:777379316 msid:OfkjcHABgxUkHlk8mfJ8ayYZdCHqdpQGFSTM 0937b040-5691-4ae3-b533-dd9ce82c4393\r\na=ssrc:777379316 mslabel:OfkjcHABgxUkHlk8mfJ8ayYZdCHqdpQGFSTM\r\na=ssrc:777379316 label:0937b040-5691-4ae3-b533-dd9ce82c4393\r\nm=video 1 RTP/SAVPF 100 116 117 96\r\nc=IN IP4 0.0.0.0\r\na=rtcp:1 IN IP4 0.0.0.0\r\na=ice-ufrag:CF4q+RW54gQVPaz0\r\na=ice-pwd:hEIbgX4MME6cPkZKGih7bjQM\r\na=ice-options:google-ice\r\na=fingerprint:sha-256 1E:7F:B8:BA:1A:8D:76:BE:A9:A5:A3:9D:59:3E:CC:BD:1B:90:7B:89:EF:F0:03:B3:9A:CA:9C:07:02:97:53:6F\r\na=setup:actpass\r\na=mid:video\r\na=extmap:2 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=sendrecv\r\na=rtcp-mux\r\na=rtpmap:100 VP8/90000\r\na=rtcp-fb:100 ccm fir\r\na=rtcp-fb:100 nack\r\na=rtcp-fb:100 nack pli\r\na=rtcp-fb:100 goog-remb\r\na=rtpmap:116 red/90000\r\na=rtpmap:117 ulpfec/90000\r\na=rtpmap:96 rtx/90000\r\na=fmtp:96 apt=100\r\na=ssrc-group:FID 187598656 415229902\r\na=ssrc:187598656 cname:Dl+cb/nGYCzEcTvH\r\na=ssrc:187598656 msid:OfkjcHABgxUkHlk8mfJ8ayYZdCHqdpQGFSTM 02ab4641-6cd5-43be-b0fe-9952585642bf\r\na=ssrc:187598656 mslabel:OfkjcHABgxUkHlk8mfJ8ayYZdCHqdpQGFSTM\r\na=ssrc:187598656 label:02ab4641-6cd5-43be-b0fe-9952585642bf\r\na=ssrc:415229902 cname:Dl+cb/nGYCzEcTvH\r\na=ssrc:415229902 msid:OfkjcHABgxUkHlk8mfJ8ayYZdCHqdpQGFSTM 02ab4641-6cd5-43be-b0fe-9952585642bf\r\na=ssrc:415229902 mslabel:OfkjcHABgxUkHlk8mfJ8ayYZdCHqdpQGFSTM\r\na=ssrc:415229902 label:02ab4641-6cd5-43be-b0fe-9952585642bf\r\n" 
    }, 
    "serverTime": 1431342100822 
} 

Вход

libjingle: Ignored line: c=IN IP4 0.0.0.0 
libjingle: Error(transport.cc:97): Answerer must use either active or passive value for setup attribute. 
libjingle:Error(webrtcsession.cc:272): Failed to set remote answer sdp: Failed to push down transport description: Answerer must use either active or passive value for setup attribute. 

** Сначала я создать предложение и добавить localdescription затем отправить его в сервер, использующий испускание, и обратный вызов возврата сервера содержит удаленный sdp **

public void onCreateSuccess(SessionDescription arg0) { 


     // TODO Auto-generated method stub 


       try { 

        if(arg0.type.canonicalForm().equalsIgnoreCase("answer")){ 
          peer.setRemoteDescription(this, sdp); 
        // mListener.onAddRemoteStream(localMS, 0); 
        } 

        else{ 
       payload = new JSONObject(); 
       payload.put("type", arg0.type.canonicalForm()); 
       Log.d("offer", arg0.type.canonicalForm().toString()); 
       payload.put("sdp", arg0.description); 

        sendMessage("rtcsid", arg0.type.canonicalForm(), payload); 
        peer.setLocalDescription(this, arg0); 


       } 
       } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

IceCandidate:

public void onIceCandidate(IceCandidate arg0) { 
     // TODO Auto-generated method stub 

     Log.d("IceCandidate", arg0.toString()); 
     JSONObject payload = new JSONObject(); 

     try { 

       payload.put("type", arg0.sdpMLineIndex); 
       Log.d("sdpMLineIndex", Integer.toString(arg0.sdpMLineIndex)); 
       payload.put("id", arg0.sdpMid); 
       Log.d("sdpMid", arg0.sdpMid.toString()); 
       payload.put("type", arg0.sdp); 
       Log.d("candidate", arg0.sdp.toString()); 
       sendMessage("easyrtcsid", "candidate", payload); 

       if(peer.getRemoteDescription()!=null){ 
       IceCandidate candidate = new IceCandidate(
         arg0.sdpMid, 
         arg0.sdpMLineIndex, 
         arg0.sdp.toString() 
       ); 
       peer.addIceCandidate(candidate); 
       } 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 


    } 

Журнал кандидата

{ 
05-11 14:59:28.495: I/libjingle(14672): Local and Remote descriptions must be applied to get SSL Role of the session. 
05-11 14:59:28.495: I/libjingle(14672): Transport: audio, allocating candidates 
05-11 14:59:28.495: D/IceGatheringChange(14672): GATHERING 
05-11 14:59:28.495: I/libjingle(14672): Transport: audio, allocating candidates 
05-11 14:59:28.495: D/IceGatheringChange(14672): GATHERING 
05-11 14:59:28.495: I/libjingle(14672): Transport: video, allocating candidates 
05-11 14:59:28.495: D/IceGatheringChange(14672): GATHERING 
05-11 14:59:28.495: I/libjingle(14672): Transport: video, allocating candidates 
05-11 14:59:28.495: D/IceGatheringChange(14672): GATHERING 
05-11 14:59:28.495: I/libjingle(14672): Jingle:Net[wlan0:10.0.0.0/8:Unknown]: Allocation Phase=Udp 
05-11 14:59:28.505: I/libjingle(14672): Jingle:Port[:1:0::Net[wlan0:10.0.0.0/8:Unknown]]: Port created 
05-11 14:59:28.505: I/libjingle(14672): AllocationSequence: UDPPort will be handling the STUN candidate generation. 
05-11 14:59:28.505: I/libjingle(14672): Adding allocated port for audio 
05-11 14:59:28.505: I/libjingle(14672): Jingle:Port[audio:1:0::Net[wlan0:10.0.0.0/8:Unknown]]: Added port to allocator 
05-11 14:59:28.525: D/IceCandidate(14672): audio:0:candidate:1281544012 1 udp 2122260223 10.0.0.112 49865 typ host generation 0 
05-11 14:59:28.525: D/sdpMLineIndex(14672): 0 
05-11 14:59:28.525: D/sdpMid(14672): audio 
05-11 14:59:28.525: D/candidate(14672): candidate:1281544012 1 udp 2122260223 10.0.0.112 49865 typ host generation 0 
05-11 14:59:28.525: I/libjingle(14672): Jingle:Net[wlan0:10.0.0.0/8:Unknown]: Allocation Phase=Udp 
05-11 14:59:28.525: I/libjingle(14672): Jingle:Port[:1:0::Net[wlan0:10.0.0.0/8:Unknown]]: Port created 
05-11 14:59:28.525: I/libjingle(14672): AllocationSequence: UDPPort will be handling the STUN candidate generation. 
05-11 14:59:28.525: I/libjingle(14672): Adding allocated port for audio 
05-11 14:59:28.525: I/libjingle(14672): Jingle:Port[audio:2:0::Net[wlan0:10.0.0.0/8:Unknown]]: Added port to allocator 
05-11 14:59:28.555: D/IceCandidate(14672): audio:0:candidate:1281544012 2 udp 2122260222 10.0.0.112 36221 typ host generation 0 
05-11 14:59:28.555: D/sdpMLineIndex(14672): 0 
05-11 14:59:28.555: D/sdpMid(14672): audio 
05-11 14:59:28.555: D/candidate(14672): candidate:1281544012 2 udp 2122260222 10.0.0.112 36221 typ host generation 0 
05-11 14:59:28.555: I/libjingle(14672): Jingle:Net[wlan0:10.0.0.0/8:Unknown]: Allocation Phase=Udp 
05-11 14:59:28.555: I/libjingle(14672): Jingle:Port[:1:0::Net[wlan0:10.0.0.0/8:Unknown]]: Port created 
05-11 14:59:28.555: I/libjingle(14672): AllocationSequence: UDPPort will be handling the STUN candidate generation. 
05-11 14:59:28.555: I/libjingle(14672): Adding allocated port for video 
05-11 14:59:28.555: I/libjingle(14672): Jingle:Port[video:1:0::Net[wlan0:10.0.0.0/8:Unknown]]: Added port to allocator 
05-11 14:59:28.565: D/IceCandidate(14672): video:1:candidate:1281544012 1 udp 2122260223 10.0.0.112 57380 typ host generation 0 
05-11 14:59:28.565: D/sdpMLineIndex(14672): 1 
05-11 14:59:28.565: D/sdpMid(14672): video 
05-11 14:59:28.565: D/candidate(14672): candidate:1281544012 1 udp 2122260223 10.0.0.112 57380 typ host generation 0 
05-11 14:59:28.575: I/libjingle(14672): Jingle:Net[wlan0:10.0.0.0/8:Unknown]: Allocation Phase=Udp 
05-11 14:59:28.575: I/libjingle(14672): Jingle:Port[:1:0::Net[wlan0:10.0.0.0/8:Unknown]]: Port created 
05-11 14:59:28.575: I/libjingle(14672): AllocationSequence: UDPPort will be handling the STUN candidate generation. 
05-11 14:59:28.575: I/libjingle(14672): Adding allocated port for video 
05-11 14:59:28.575: I/libjingle(14672): Jingle:Port[video:2:0::Net[wlan0:10.0.0.0/8:Unknown]]: Added port to allocator 
05-11 14:59:28.605: D/IceCandidate(14672): video:1:candidate:1281544012 2 udp 2122260222 10.0.0.112 48445 typ host generation 0 
05-11 14:59:28.605: D/sdpMLineIndex(14672): 1 
05-11 14:59:28.605: D/sdpMid(14672): video 
05-11 14:59:28.605: D/candidate(14672): candidate:1281544012 2 udp 2122260222 10.0.0.112 48445 typ host generation 0 
05-11 14:59:28.625: W/libjingle(14672): Warning(thread.cc:320): Waiting for the thread to join, but blocking calls have been disallowed 
05-11 14:59:28.625: W/libjingle(14672): Warning(thread.cc:320): Waiting for the thread to join, but blocking calls have been disallowed 
05-11 14:59:28.625: W/libjingle(14672): Warning(thread.cc:320): Waiting for the thread to join, but blocking calls have been disallowed 
05-11 14:59:28.625: W/libjingle(14672): Warning(thread.cc:320): Waiting for the thread to join, but blocking calls have been disallowed 
05-11 14:59:28.625: W/libjingle(14672): Warning(thread.cc:320): Waiting for the thread to join, but blocking calls have been disallowed 
05-11 14:59:28.625: W/libjingle(14672): Warning(thread.cc:320): Waiting for the thread to join, but blocking calls have been disallowed 
05-11 14:59:28.625: W/libjingle(14672): Warning(thread.cc:320): Waiting for the thread to join, but blocking calls have been disallowed 
05-11 14:59:28.625: W/libjingle(14672): Warning(thread.cc:320): Waiting for the thread to join, but blocking calls have been disallowed 
05-11 14:59:28.625: W/libjingle(14672): Warning(thread.cc:320): Waiting for the thread to join, but blocking calls have been disallowed 
05-11 14:59:28.625: W/libjingle(14672): Warning(thread.cc:320): Waiting for the thread to join, but blocking calls have been disallowed 
05-11 14:59:28.625: I/libjingle(14672): Jingle:Net[wlan0:10.0.0.0/8:Unknown]: Allocation Phase=Relay 
05-11 14:59:28.625: I/libjingle(14672): Jingle:Net[wlan0:10.0.0.0/8:Unknown]: Allocation Phase=Relay 
05-11 14:59:28.635: W/libjingle(14672): Warning(thread.cc:320): Waiting for the thread to join, but blocking calls have been disallowed 
05-11 14:59:28.635: I/libjingle(14672): Jingle:Net[wlan0:10.0.0.0/8:Unknown]: Allocation Phase=Relay 
05-11 14:59:28.635: W/libjingle(14672): Warning(thread.cc:320): Waiting for the thread to join, but blocking calls have been disallowed 
05-11 14:59:28.635: D/IceCandidate(14672): audio:0:candidate:2940422560 1 udp 1686052607 197.44.239.36 49865 typ srflx raddr 10.0.0.112 rport 49865 generation 0 
05-11 14:59:28.635: D/sdpMLineIndex(14672): 0 
05-11 14:59:28.635: D/sdpMid(14672): audio 
05-11 14:59:28.635: D/candidate(14672): candidate:2940422560 1 udp 1686052607 197.44.239.36 49865 typ srflx raddr 10.0.0.112 rport 49865 generation 0 
05-11 14:59:28.645: D/IceCandidate(14672): audio:0:candidate:2940422560 2 udp 1686052606 197.44.239.36 36221 typ srflx raddr 10.0.0.112 rport 36221 generation 0 
05-11 14:59:28.645: D/sdpMLineIndex(14672): 0 
05-11 14:59:28.645: D/sdpMid(14672): audio 
05-11 14:59:28.645: D/candidate(14672): candidate:2940422560 2 udp 1686052606 197.44.239.36 36221 typ srflx raddr 10.0.0.112 rport 36221 generation 0 
05-11 14:59:28.665: I/libjingle(14672): Jingle:Net[wlan0:10.0.0.0/8:Unknown]: Allocation Phase=Relay 
05-11 14:59:28.675: D/IceCandidate(14672): video:1:candidate:2940422560 1 udp 1686052607 197.44.239.36 57380 typ srflx raddr 10.0.0.112 rport 57380 generation 0 
05-11 14:59:28.675: D/sdpMLineIndex(14672): 1 
05-11 14:59:28.675: D/sdpMid(14672): video 
05-11 14:59:28.675: D/candidate(14672): candidate:2940422560 1 udp 1686052607 197.44.239.36 57380 typ srflx raddr 10.0.0.112 rport 57380 generation 0 
05-11 14:59:28.685: I/libjingle(14672): Jingle:Net[wlan0:10.0.0.0/8:Unknown]: Allocation Phase=Tcp 
05-11 14:59:28.685: I/libjingle(14672): Jingle:Port[:1:0:local:Net[wlan0:10.0.0.0/8:Unknown]]: Port created 
05-11 14:59:28.685: I/libjingle(14672): Adding allocated port for audio 
05-11 14:59:28.685: I/libjingle(14672): Jingle:Port[audio:1:0:local:Net[wlan0:10.0.0.0/8:Unknown]]: Added port to allocator 
05-11 14:59:28.685: I/libjingle(14672): Jingle:Net[wlan0:10.0.0.0/8:Unknown]: Allocation Phase=Tcp 
05-11 14:59:28.685: D/IceCandidate(14672): audio:0:candidate:48313276 1 tcp 1518280447 10.0.0.112 40627 typ host tcptype passive generation 0 
05-11 14:59:28.685: D/sdpMLineIndex(14672): 0 
05-11 14:59:28.685: D/sdpMid(14672): audio 
05-11 14:59:28.685: D/candidate(14672): candidate:48313276 1 tcp 1518280447 10.0.0.112 40627 typ host tcptype passive generation 0 
05-11 14:59:28.685: I/libjingle(14672): Jingle:Port[:1:0:local:Net[wlan0:10.0.0.0/8:Unknown]]: Port created 
05-11 14:59:28.685: I/libjingle(14672): Adding allocated port for audio 
05-11 14:59:28.685: I/libjingle(14672): Jingle:Port[audio:2:0:local:Net[wlan0:10.0.0.0/8:Unknown]]: Added port to allocator 
05-11 14:59:28.685: I/libjingle(14672): Jingle:Net[wlan0:10.0.0.0/8:Unknown]: Allocation Phase=Tcp 
05-11 14:59:28.685: D/IceCandidate(14672): audio:0:candidate:48313276 2 tcp 1518280446 10.0.0.112 48390 typ host tcptype passive generation 0 
05-11 14:59:28.685: D/sdpMLineIndex(14672): 0 
05-11 14:59:28.685: D/sdpMid(14672): audio 
05-11 14:59:28.685: D/candidate(14672): candidate:48313276 2 tcp 1518280446 10.0.0.112 48390 typ host tcptype passive generation 0 
05-11 14:59:28.695: I/libjingle(14672): Jingle:Port[:1:0:local:Net[wlan0:10.0.0.0/8:Unknown]]: Port created 
05-11 14:59:28.695: I/libjingle(14672): Adding allocated port for video 
05-11 14:59:28.695: I/libjingle(14672): Jingle:Port[video:1:0:local:Net[wlan0:10.0.0.0/8:Unknown]]: Added port to allocator 
05-11 14:59:28.695: D/IceCandidate(14672): video:1:candidate:48313276 1 tcp 1518280447 10.0.0.112 60960 typ host tcptype passive generation 0 
05-11 14:59:28.695: D/sdpMLineIndex(14672): 1 
05-11 14:59:28.695: D/sdpMid(14672): video 
05-11 14:59:28.695: D/candidate(14672): candidate:48313276 1 tcp 1518280447 10.0.0.112 60960 typ host tcptype passive generation 0 
05-11 14:59:28.705: D/IceCandidate(14672): video:1:candidate:2940422560 2 udp 1686052606 197.44.239.36 48445 typ srflx raddr 10.0.0.112 rport 48445 generation 0 
05-11 14:59:28.705: D/sdpMLineIndex(14672): 1 
05-11 14:59:28.715: D/sdpMid(14672): video 
05-11 14:59:28.715: D/candidate(14672): candidate:2940422560 2 udp 1686052606 197.44.239.36 48445 typ srflx raddr 10.0.0.112 rport 48445 generation 0 
05-11 14:59:28.725: I/libjingle(14672): Jingle:Net[wlan0:10.0.0.0/8:Unknown]: Allocation Phase=Tcp 
05-11 14:59:28.725: I/libjingle(14672): Jingle:Port[:1:0:local:Net[wlan0:10.0.0.0/8:Unknown]]: Port created 
05-11 14:59:28.725: I/libjingle(14672): Adding allocated port for video 
05-11 14:59:28.725: I/libjingle(14672): Jingle:Port[video:2:0:local:Net[wlan0:10.0.0.0/8:Unknown]]: Added port to allocator 
05-11 14:59:28.725: D/IceCandidate(14672): video:1:candidate:48313276 2 tcp 1518280446 10.0.0.112 59723 typ host tcptype passive generation 0 
05-11 14:59:28.725: D/sdpMLineIndex(14672): 1 
05-11 14:59:28.725: D/sdpMid(14672): video 
05-11 14:59:28.725: D/candidate(14672): candidate:48313276 2 tcp 1518280446 10.0.0.112 59723 typ host tcptype passive generation 0 
05-11 14:59:28.735: I/libjingle(14672): Jingle:Net[wlan0:10.0.0.0/8:Unknown]: Allocation Phase=SslTcp 
05-11 14:59:28.735: I/libjingle(14672): Jingle:Net[wlan0:10.0.0.0/8:Unknown]: Allocation Phase=SslTcp 
05-11 14:59:28.735: I/libjingle(14672): All candidates gathered for audio:2:0 
05-11 14:59:28.735: I/libjingle(14672): Transport: audio, component 2 allocation complete 
05-11 14:59:28.745: I/libjingle(14672): Jingle:Net[wlan0:10.0.0.0/8:Unknown]: Allocation Phase=SslTcp 
05-11 14:59:28.745: I/libjingle(14672): All candidates gathered for video:1:0 
05-11 14:59:28.745: I/libjingle(14672): Transport: video, component 1 allocation complete 
05-11 14:59:28.775: I/libjingle(14672): Jingle:Net[wlan0:10.0.0.0/8:Unknown]: Allocation Phase=SslTcp 
05-11 14:59:28.775: I/libjingle(14672): All candidates gathered for video:2:0 
05-11 14:59:28.775: I/libjingle(14672): Transport: video, component 2 allocation complete 
05-11 14:59:28.775: I/libjingle(14672): Transport: video allocation complete 
05-11 14:59:28.775: I/libjingle(14672): Candidate allocation not done for audio 
05-11 14:59:28.795: I/libjingle(14672): All candidates gathered for audio:1:0 
05-11 14:59:28.795: I/libjingle(14672): Transport: audio, component 1 allocation complete 
05-11 14:59:28.795: I/libjingle(14672): Transport: audio allocation complete 
05-11 14:59:28.795: I/libjingle(14672): Candidate gathering is complete. 
05-11 14:59:28.795: D/IceGatheringChange(14672): COMPLETE 
} 

MediaConstraints

pcConstraints.mandatory.add(new MediaConstraints.KeyValuePair("OfferToReceiveAudio", "true")); 
       pcConstraints.mandatory.add(new MediaConstraints.KeyValuePair("OfferToReceiveVideo", "true")); 
       pcConstraints.optional.add(new MediaConstraints.KeyValuePair("DtlsSrtpKeyAgreement", "true")); 
+0

Можете ли вы разместить еще какой-нибудь код? Одна сторона создает предложение, устанавливает его как локальное описание и отправляет его на пульт. Пульт устанавливает этот sdp как удаленное описание и генерирует ответ, который отправляется обратно на другую сторону. Этот ответ затем устанавливается как удаленное описание на первой стороне (той, которая сгенерировала предложение). Вы не можете создать ответ, если вы еще не установили удаленное описание. Нам нужно знать, где этот процесс отличается от вашего кода. – Kevin

+0

[Этот вопрос кажется актуальным] (https://code.google.com/p/webrtc/issues/detail?id=3872). У вас включен DTLS? Вы можете включить DTLS при первом создании своего peerconnection. createPeerconnection() принимает объект MediaConstraints для второго параметра, просто передайте необязательный ключ/значение «DtlsSrtpKeyAgreement» как «true». – Kevin

+0

Спасибо Kevin за ваш повтор .. Я обновляю свой код .i уже создаю предложение, затем устанавливаю локальное описание и получаю удаленный SDP с сервера. Также я устанавливаю DtlsSrtpKeyAgreement как истинный, но до сих пор не могу добавить удаленное описание –

ответ

4

Хранить в помните, что это мой собственный скромный код, он может быть не идеальным, и может быть сложно просто скопировать все в ваш собственный проект. Это работает для меня, но это не значит, что это будет для всех остальных.

Процесс установки вызова выглядит следующим образом (обратите внимание, это не установлено в камне):

Есть 2 устройства, А и В, оба подключены к какому-то сигнализации сервера, чтобы позволить чтобы обменять SDP и ICE кандидатов, а также пригласить друг друга на вызовы и т. д.

A начинает вызов, первым шагом, вероятно, будет отправка приглашения на B. Мне нравится также инициировать объект peerconnection в этом пункте, используя следующий код:

//initialize the peerconnection factory 
PeerConnectionFactory.initializeAndroidGlobals(MainActivity.context, true, true, true, parent.tex_remote); 
factory = new PeerConnectionFactory(); 

//ice server initialization 
ArrayList<PeerConnection.IceServer> iceServers = new ArrayList<>(); 
iceServers.add(new PeerConnection.IceServer("stun:stun.xxx.xxx:xxx")); 
iceServers.add(new PeerConnection.IceServer("turn:turn.xxx.xxx:xxx", "xxx", "xxx")); 

//create a new contraints object to configure the connection 
MediaConstraints connectionConstraints = new MediaConstraints(); 
connectionConstraints.mandatory.add(new MediaConstraints.KeyValuePair("offerToReceiveAudio", "true")); 
connectionConstraints.mandatory.add(new MediaConstraints.KeyValuePair("offerToReceiveVideo", "true")); 
connectionConstraints.optional.add(new MediaConstraints.KeyValuePair("DtlsSrtpKeyAgreement", "true")); 

//create a new peerconnection object 
peerConnection = factory.createPeerConnection(iceServers, connectionConstraints, observer); 

Когда это будет сделано, и у вас есть объект PeerConnection, вы можете инициализировать локальный поток средств массовой информации, используя следующий код:

//create a new audio and video source, this is the stream that will be sent to the remote 
VideoSource videoSource = factory.createVideoSource(VideoCapturer.create("Camera 1, Facing front, Orientation 270"), new MediaConstraints()); 
AudioSource audioSource = factory.createAudioSource(new MediaConstraints()); 

//create a new audio and video track 
VideoTrack videoTrack = factory.createVideoTrack("ARDAMSv0", videoSource); 
AudioTrack audioTrack = factory.createAudioTrack("ARDAMSa0", audioSource); 

//create a new media stream, this holds all local streams and their tracks 
MediaStream lms = factory.createLocalMediaStream("ARDAMS"); 

//create a new video renderer and add it to the video track 
VideoRenderer renderer = new VideoRenderer(parent); 
videoTrack.addRenderer(renderer); 

//add the video track to the stream 
lms.addTrack(videoTrack); 
//add the audio track to the stream 
lms.addTrack(audioTrack); 

//add the stream to the connection 
peerConnection.addStream(lms); 

Между тем, B получит вызов приглашения от сервера сигнализации и должны представить пользователю какое-либо вид входящего вызова. Когда пользователь решает ответить на вызов, B отправляет сигнал приема обратно на A.

Когда A принимает этот принимаемый сигнал, пришло время начать настройку самого вызова. Вызов createOffer() на А, а библиотека будет вызывать onCreateSuccess(), если это удастся:

peerConnection.createOffer(observer, new MediaConstraints()); 

В onCreateSuccess(), вы можете вызвать setLocalDescription() с вновь созданным SDP.Вы также должны отправить эту SDP В, так что вы могли бы также сделать это здесь:

peerConnection.setLocalDescription(this, sessionDescription); 
//send this SDP to your remote peer 

B теперь будет получать Оферту, которая вам придется установить по телефону setRemoteDescription():

peerConnection.setRemoteDescription(observer, sdp); 

Библиотека вызовет onSetSuccess(), если это будет выполнено успешно. В onSetSuccess() можно вызвать createAnswer():

peerConnection.createAnswer(observer, constraints); 

Потому что теперь вы уверены, что у вас есть начальный набор предложение SDP. Библиотека снова вызовет функциюCreateSuccess(). То же самое, что и с предложением А теперь происходит с ответом Б. Он установит ответ как локальный SDP, и отправить его в A:

peerConnection.setLocalDescription(this, sessionDescription); 
//send this SDP to your remote peer 

Когда все это сделано, обмениваясь SDPS завершена. Библиотека также будет вызывать onIceCandidate() несколько раз. Вам нужно отправить этого кандидата ICE другому партнеру и вызвать peerConnection.addIceCandidate(), когда вы получите кандидата ICE от другого партнера.

+0

Я сделал все это. Кажется, что он работает, но с очень большими зависаниями. Может быть, это из-за низкого битрейта? Я не нашел методов для установки битрейта в библиотеке libjingle. Какие-либо предложения? – Lester

+0

@ Lester Какое устройство вы тестируете? Вы использовали ограничения для ограничения разрешения и частоты кадров? Мобильные устройства не такие мощные, как настольные компьютеры, поэтому устройства нижнего уровня имеют сложное время с видеовызовом. – Kevin

+0

Nexus5, Nexus4, SamsungA5. Да, я добавил ограничения: maxHeight = 1920, maxWidth = 1080, maxFrameRate = 30, minFrameRate = 30 – Lester

0
pcConstraints.optional.add(new KeyValuePair("DtlsSrtpKeyAgreement", "true")); 
pcConstraints.optional.add(new KeyValuePair("RtpDataChannels", "true")); 
+1

Am с помощью Socket.io – Vinay

Смежные вопросы