概念
房间
房间是一个音视频空间,同一房间内的用户可以互相接收对方的实时音视频
- 实时音视频使用房间这个虚拟的概念,用于用户之间的相互隔离。
- 只有在同一个房间里的用户才可以相互接收音视频。
- 一个用户同一时间只能在一个房间内。如果要进入另一个房间,必须从前一个房间内退出。
注意:
- 第一个创建房间的用户即这个房间的所有者,但该用户无法主动解散房间。
- 所有用户都主动退出房间时,服务端会马上解散房间。
- 如果单个用户异常掉线,30 秒后服务端会将该用户清理出房间;如果所有的用户都异常掉线,30 秒后服务端会自动解散这个房间。
- 当用户要加入的房间不存在时,实时音视频后台会先创建一个房间,然后再把用户加入。
旁路直播
旁路直播是一种直播方式,通常用于不同协议的音视频系统之间进行数据转发。实时音视频服务端通过旁路直播的方式,将通话房间中的音视频数据以 RTMP 推流的形式,推送至云直播服务,从而实现旁路直播、旁路转推、云端混流以及云端录制等功能。
RoomID
实时音视频服务里使用 RoomID(房间号)来唯一标识一个房间。RoomID 是由开发者自行维护和分配的一个 uint32 范围内的数字
UserID
UserID(用户标识)用于在一个实时音视频应用中唯一标识一个用户。
- 用户标识是用户登录开发者业务系统的帐号在腾讯云上的映射。通常情况下,开发者可直接使用用户名作为 UserID。
- 长度建议不超过 32 字节。请使用英文字符、数字或下划线,不能全为数字,大小写不敏感。
UserSig
UserSig(用户签名)用于对一个用户进行登录鉴权认证,确认用户是否真实。用户签名生成方法可参考 生成签名 文档。
入门
https://console.cloud.tencent.com/trtc/app/detail/quickstart/
使用案例
调用
1 2 3
|
window.open("https://ip:8443/TRTC/index.html?user=" + loginname + "&peer=" + encodeURIComponent(peer_username), "new");
|
Web
IM 登录,向指定用户发送自定义消息「加入指定房间,进行音视频通信」
GenerateTestUserSig.js
common.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| rtc = new RtcClient(options); join();
var tim_options = { SDKAppID: options.sdkAppId };
var tim = TIM.create(tim_options);
tim.setLogLevel(0);
tim.on(TIM.EVENT.SDK_READY, function (event) {
var roomId = $("#roomId").val(); var peerUser = $("#peerUser").val(); if(peerUser == '') { return; } let message = tim.createCustomMessage({ to: peerUser, conversationType: TIM.TYPES.CONV_C2C, payload: { data: JSON.stringify({'call_type': 2, 'room_id': parseInt(roomId), 'version': 1}), description: 'description', extension: '' } }); let promise = tim.sendMessage(message); promise.then(function (imResponse) { console.log(imResponse); }).catch(function (imError) { console.warn('sendMessage error:', imError); }); });
tim.on(TIM.EVENT.MESSAGE_RECEIVED, function (event) { console.log(event.data); event.data.forEach(msg=>{ if(msg.payload.data) { var data = JSON.parse(msg.payload.data); if(data.line_busy == 3) { layer.msg("对方已挂断,请稍后再拨"); } } }); });
tim.login({userID: options.userId, userSig: options.userSig});
|
Android
解析来自 Web 发送的自定义消息,解析房间 Id,进入房间,音视频通话
配置 GenerateTestUserSig.java
核心 TRTCCallingImpl.java -> login()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| V2TIMManager.getInstance().addSimpleMsgListener(new V2TIMSimpleMsgListener() { @Override public void onRecvC2CCustomMessage(String msgID, V2TIMUserInfo s, byte[] customData) { String data = new String(customData).toString(); final String sender = s.getUserID(); TRTCLogger.d(TAG, "sender:" + sender + " data:" + data); Map<String, Object> extraMap = new Gson().fromJson(data, Map.class); if (extraMap.containsKey(CallModel.SIGNALING_EXTRA_KEY_CALL_TYPE)) { int callType = ((Double) extraMap.get(CallModel.SIGNALING_EXTRA_KEY_CALL_TYPE)).intValue(); switch (callType) { case TRTCCalling.TYPE_VIDEO_CALL: if (!isCallingData(data)) { return; }
mCurCallID = msgID; processInvite(msgID, sender, null, Arrays.asList(sender), data); break; case CallModel.VIDEO_CALL_ACTION_ACCEPT:
if (!isCallingData(data)) { return; } mCurInvitedList.remove(sender); break; case CallModel.VIDEO_CALL_ACTION_HANGUP:
break; } } } });
|