webrtc 从连接上房间服务器到p2p音视频通话的流程梳理(一)

我们需要模拟clientA像clientB请求音视频聊天,那么流程是怎么样的呢?

sdp信息包含了音视频的编解码的信息,根据这个信息初始化要对应的编解码器去解码接收到的音视频数据.

因为房间是一对一的,也就是每个设备连接上来的时候,其实是知道房间内又没有人的.

当我们连接上房间服务器的时候:

 private void onConnectedToRoomInternal(final SignalingParameters params) 

我们知道房间内是否又其它设备,所以:

   //在这里要注意:
    if (signalingParameters.initiator) {//如果是先进入房间里
      logAndToast("Creating OFFER...");
      // Create offer. Offer SDP will be sent to answering client in
      // PeerConnectionEvents.onLocalDescription event.
      peerConnectionClient.createOffer();//房间内没有设备,就把当前设备的sdp信息发送到房间服务器
    } else {
      if (params.offerSdp != null) {//如果房间内已经有人了,那么就需要应答
        peerConnectionClient.setRemoteDescription(params.offerSdp);//房间内已经设备的sdp信息
        logAndToast("Creating ANSWER...");
        // Create answer. Answer SDP will be sent to offering client in
        // PeerConnectionEvents.onLocalDescription event.
        peerConnectionClient.createAnswer();
      }
      if (params.iceCandidates != null) {
        // Add remote ICE candidates from room.
        for (IceCandidate iceCandidate : params.iceCandidates) {
          peerConnectionClient.addRemoteIceCandidate(iceCandidate);
        }
      }
    }

看上面的代码 :

当我们连接上房间服务器后,我们是可以知道房间服务器内是否有人当.

1.如果房间服务器内没有人,那么我们需要创建自己当offer sdp
随后我们会:

peerConnectionClient.createOffer();

然后房间服务器会通知我们把offser sdp发送出去,也是通过接口操作通知的.

注意这个接口是:
PeerConnectionClient.PeerConnectionEvents

  public void onLocalDescription(final SessionDescription sdp) {
    final long delta = System.currentTimeMillis() - callStartedTimeMs;
    runOnUiThread(new Runnable() {
      @Override
      public void run() {
        if (appRtcClient != null) {
          logAndToast("Sending " + sdp.type + ", delay=" + delta + "ms");
          if (signalingParameters.initiator) {
            appRtcClient.sendOfferSdp(sdp);
          } else {
            appRtcClient.sendAnswerSdp(sdp);
          }
        }
        if (peerConnectionParameters.videoMaxBitrate > 0) {
          Log.d(TAG, "Set video maximum bitrate: " + peerConnectionParameters.videoMaxBitrate);
          peerConnectionClient.setVideoMaxBitrate(peerConnectionParameters.videoMaxBitrate);
        }
      }
    });
  }

2.如果房间内已经有人了,当我们connectToRomm当时候其实我们就已经知道了已经在房间内当设备当sdp信息,所以我们需要创建我们当应答sdp信息.

 peerConnectionClient.createAnswer();

同样当,紧接着房间服务器也会要求我们把我们当应答sdp信息发送给已经在房间内当设备:

public void onLocalDescription(final SessionDescription sdp) 
.....
appRtcClient.sendAnswerSdp(sdp);

那么已经在房间内当设备就可以通过接口收到连接上来当设备当sdp信息了.

public void onRemoteDescription(final SessionDescription sdp) 
..
..
peerConnectionClient.setRemoteDescription(sdp);

上面的操作完成后,在房间内当2个设备基本就知道双方当sdp信息了,那么就可以基于此初始化编解码器了.

你可能感兴趣的:(webrtc代码研究)