@binbins
2021-04-06T15:06:53.000000Z
字数 3958
阅读 97
目录 | 说明 |
---|---|
RCMicRoomViewController | 房间视图控制器,负责房间内各子视图的初始化、加载以及各模块之间 UI 上的交互 |
ViewModel | 房间模块 ViewModel,负责房间中各视图的数据加载及处理 |
HeaderFooter | 自定义顶部导航栏及底部工具栏 |
Participants | 麦位模块 |
Chat | 消息展示模块 |
BottomDialog | 房间内各种弹窗 |
InputBar | 输入工具栏 |
RTCStatus | RTC 相关状态监控 |
RCMicRoomViewModel 类主要负责 IM、RTC 层房间的创建销毁,消息的收发监听,音视频流的发布订阅以及根据聊天室 KV 的改变更新相关状态(上下麦、正在发言状态等)
麦位用户变更、麦位发言状态等信息的变更都是通过 IM 聊天室的 KV 存储来实现的,端上收到对应 KV 变更的消息后根据不同的 key 来更新不同的数据,demo 中用到的几种 Key 均在RCMicIMService.h
文件中定义
RCMicRoomViewModel.h,代码中标签划分的代码块说明:
RCMicRoomViewModel.m,代码中标签划分的代码块说明:
从房间列表进入的房间默认都是观众身份进入,只有从创建房间的入口进入时会以主持人身份进入
主持人
观众
//直播流地址:
"liveUrl":"http://abc.com"
//麦位相关:
//最后的 0-8 表示九个麦位,0 为主持人
"sealmic_position_0":
{
"userId":"abcde",
//0:正常状态(此时 userId 存在则说明麦位上有人,否则表示当前为空麦位),1:锁定状态(不允许上人),2:闭麦状态(当前麦位上的用户被禁言)
"state":0,
//0-8 表示九个麦位
"position":0
}
//正在发言相关:
//最后的 0-8 表示九个麦位,0 为主持人
"speaking_0":
{
//0 表示当前未发言,1 表示正在发言
"speaking":0,
//0-8 表示九个麦位
"position":0
}
//是否有人排麦相关:
//0 表示没人在排麦,1 表示有人在排麦
"applied_mic_list_empty":0
如果是发言状态更新的 Key
如果是排麦状态变更的 Key
如果是麦位相关更新的 Key
currentUserId //当前用户的 userId
currentParticipantInfo //当前登录用户本地保存的麦位信息(如果有则说明当前用户在麦位上)
currentRole //当前用户的角色(观众、普通麦位用户、主持人)
newParticipantInfo //此次 KV 消息所携带的最新的麦位信息
changeType //KV 中携带的相关类型说明
//发生变化后麦位上的用户是自己时(表明此次变化后自己可能需要上麦或者根据麦位更新状态)
if (newParticipantInfo.userId == currentUserId) {
if(currentRole == 观众) {
从观众转为参会者的操作
}
//当前用户不在麦位或者当前用户所在麦位的状态和新的麦位状态不匹配
if(currentParticipantInfo == nil || currentParticipantInfo.state != newParticipantInfo.state){
根据新麦位的状态更新本地的麦克风状态(禁用或启用)
}
在本地保存的麦位信息改变前将所在麦位的发言状态手动设置为 NO 一次
将本地保存的当前用户的麦位信息更新为新麦位的信息
} else {
//如果 changeType 不是 (4,5,6)中的一种并且当前用户的麦位信息存在(也就是当前用户在麦位上)并且新麦位的序号等于当前用户所在麦位序号时
//说明发生变更的麦位是自己之前所持有的且变化后麦位上的人不是自己且此次变化类型不是双方在麦位互换身份(为了避免用户和主持人切换身份时频繁进行上下麦操作,麦位上互换身份时不做 RTC 层的上下麦处理),则需要进行下麦操作
if(changeType != 4 && changeType != 5 && changeType != 6 && currentParticipantInfo != nil && currentParticipantInfo.position == newParticipantInfo.position) {
从麦位用户转为观众的操作
在本地保存的麦位信息改变前将所在麦位的发言状态手动设置为 NO 一次
将本地保存的当前用户的麦位信息更新为新麦位的信息
}
}
RCMic:transferHostMsg
类型的自定义消息,消息中包含操作的发起者和接收者RCMic:transferHostMsg
消息,消息中包含此次被邀请用户的响应(同意还是拒绝)RCMic:takeOverHostMsg
类型的消息,其中的各个字段和之前的消息意义都类似