web rtc信令流程

之前再做rtc视频通话的时候,参考的demo代码流程阅读

GitHub - ddssingsong/webrtc_server_java: P2P Webrtc VideoConference 视频通话 视频会议

SocketManager.getInstance().connect(Urls.WS, username, 0);

  1. 连接 websocket ws://42.192.40.58:5000/ws/lunlian/0

根据用户名,设备,拼接的地址

  1. 收到服务器发送的登录成功消息

{"eventName":"__login_success","data":{"avatar":"p1.jpeg","userID":"lunlian"}}

启动页收到 登录 成功消息,进入 主界面

  1. 主界面的 UserListFragment 初始化

获取用户列表 http://42.192.40.58:5000/userList,param = null

  1. 视频页面

CallSingleActivity.openActivity(getContext(), userBean.getUserId(), true, userBean.getNickName(), false, false);

gEngineKit = SkyEngineKit.Instance();

SkyEngineKit.init(new VoipEvent());

targetId = intent.getStringExtra(EXTRA_TARGET);

isFromFloatingView = intent.getBooleanExtra(EXTRA_FROM_FLOATING_VIEW, false);

isOutgoing = intent.getBooleanExtra(EXTRA_MO, false);

isAudioOnly = intent.getBooleanExtra(EXTRA_AUDIO_ONLY, false);

如果是打出去

  1. 视频页面 创建会话

room = UUID.randomUUID().toString() + System.currentTimeMillis();

boolean b = gEngineKit.startOutCall(getApplicationContext(), room, targetId, audioOnly);

if (!b) {

finish();

return;

}

App.getInstance().setRoomId(room);

App.getInstance().setOtherUserId(targetId);

CallSession session = gEngineKit.getCurrentSession();

if (session == null) {

finish();

} else {

session.setSessionCallback(this);

}

其中 startOutCall

// 初始化会话

mCurrentCallSession = new CallSession(context, room, audioOnly, mEvent);

mCurrentCallSession.setTargetId(targetId);

mCurrentCallSession.setIsComing(false);

mCurrentCallSession.setCallState(EnumType.CallState.Outgoing);

// 创建房间

mCurrentCallSession.createHome(room, 2);

//CallSession

public CallSession(Context context, String roomId, boolean audioOnly, ISkyEvent event) {

executor = Executors.newSingleThreadExecutor();

this.mIsAudioOnly = audioOnly;

this.mRoomId = roomId;

this.mEvent = event;

iEngine = AVEngine.createEngine(new WebRTCEngine(audioOnly, context));

iEngine.init(this);

}

在 WebRTCEngine中

createConnectionFactory

createLocalStream

mCurrentCallSession.createHome(room, 2);

CallSession

public void createHome(String room, int roomSize) {

executor.execute(() -> {

if (mEvent != null) {

mEvent.createRoom(room, roomSize);

}

});

}

VoipEvent

@Override

public void createRoom(String room, int roomSize) {

SocketManager.getInstance().createRoom(room, roomSize);

}

SocketManager

public void createRoom(String room, int roomSize) {

if (webSocket != null) {

webSocket.createRoom(room, roomSize, myId);

}

}

MyWebSocket

发送,拨打视频电话,发出

public void createRoom(String room, int roomSize, String myId) {

Map map = new HashMap<>();

map.put("eventName", "__create");

Map childMap = new HashMap<>();

childMap.put("room", room);

childMap.put("roomSize", roomSize);

childMap.put("userID", myId);

map.put("data", childMap);

JSONObject object = new JSONObject(map);

final String jsonString = object.toString();

Log.d(TAG, "send-->" + jsonString);

send(jsonString);

}

send-->{"data":{"roomSize":2,"userID":"party","room":"9c2feb88-8f79-400d-aa12-6786a78f13191693378457275"},"eventName":"__create"}

  1. 收到服务器 __peers事件

{"eventName":"__peers","data":{"roomSize":2,"connections":"","you":"party"}}

MyWebSocket

private void handlePeers(Map map) {

Map data = (Map) map.get("data");

if (data != null) {

String you = (String) data.get("you"); //自已的名字

String connections = (String) data.get("connections");

int roomSize = (int) data.get("roomSize");

this.iEvent.onPeers(you, connections, roomSize);

}

}

SocketManager

@Override // 加入房间

public void onPeers(String myId, String connections, int roomSize) {

handler.post(() -> {

//自己进入了房间,然后开始发送offer

CallSession currentSession = SkyEngineKit.Instance().getCurrentSession();

if (currentSession != null) {

currentSession.onJoinHome(myId, connections, roomSize);

}

});

}

CallSession

public void onJoinHome(String myId, String users, int roomSize) {

if (!mIsComing) { // 发送邀请

if (roomSize == 2) {

List inviteList = new ArrayList<>();

inviteList.add(mTargetId);

mEvent.sendInvite(mRoomId, inviteList, mIsAudioOnly);

}

}

}

  1. 发送邀请sendInvite

VoipEvent

public void sendInvite(String room, List userIds, boolean audioOnly) {

SocketManager.getInstance().sendInvite(room, userIds, audioOnly);

}

SocketManager

public void sendInvite(String room, List users, boolean audioOnly) {

if (webSocket != null) {

webSocket.sendInvite(room, myId, users, audioOnly);

}

}

MyWebSocket

public void sendInvite(String room, String myId, List users, boolean audioOnly) {

Map map = new HashMap<>();

map.put("eventName", "__invite");

Map childMap = new HashMap<>();

childMap.put("room", room);

childMap.put("audioOnly", audioOnly);

childMap.put("inviteID", myId);

String join = StringUtil.listToString(users);

childMap.put("userList", join);

map.put("data", childMap);

JSONObject object = new JSONObject(map);

final String jsonString = object.toString();

Log.d(TAG, "send-->" + jsonString);

send(jsonString);

}

send-->{"data":{"userList":"likeuuuuuu","inviteID":"party","audioOnly":false,"room":"9c2feb88-8f79-400d-aa12-6786a78f13191693378457275"},"eventName":"__invite"}

  1. 收到服务器发送的对方已响铃

{"data":{"toID":"party","fromID":"likeuuuuuu","room":"9c2feb88-8f79-400d-aa12-6786a78f13191693378457275"},"eventName":"__ring"}

MyWebSocket

private void handleRing(Map map) {

Map data = (Map) map.get("data");

if (data != null) {

String fromId = (String) data.get("fromID");

this.iEvent.onRing(fromId);

}

}

SocketManager

public void onRing(String fromId) {

handler.post(() -> {

CallSession currentSession = SkyEngineKit.Instance().getCurrentSession();

if (currentSession != null) {

currentSession.onRingBack(fromId);

}

});

}

CallSession

public void onRingBack(String userId) {

if (mEvent != null) {

mEvent.onRemoteRing();

//mEvent.shouldStartRing(false);

}

}

  1. 对方拒绝

{"data":{"toID":"party","refuseType":"1","fromID":"likeuuuuuu","room":"9c2feb88-8f79-400d-aa12-6786a78f13191693378457275"},"eventName":"__reject"}

MyWebSocket

private void handleReject(Map map) {

Map data = (Map) map.get("data");

if (data != null) {

String fromID = (String

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值