我们需要模拟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信息了,那么就可以基于此初始化编解码器了.