多人呼叫
多人呼叫與點對點呼叫差別在于多人呼叫是一次呼叫1個以上的人,中途也可以再呼叫邀請别人加入通話。 整個呼叫的流程跟點對點呼叫類似,但也有些差別,需要添加額外的 API 邏輯來實作功能。下面我們分主叫被叫兩種角色來分析。
主叫
發起呼叫
建立多個LocalInvitation 對象
val callArray = arrayOf("1234","5678","8888")
callArray.forEach {
val localInvitation = rtmCallManager.createLocalInvitation(it)
localInvitation.setContent("自定義的消息體")
//通常我們都會選擇發送json格式字元串,例如
"mediaType":0 //0視訊 1 音頻
"isMeeting":0 //0 多人模式 1 p2p
"rtcChannelId":"10000"//⚠️這個參數尤為重要,這個參數通常都由主叫生成,在呼叫的時候帶給被叫。該參數的作用是告訴對方我們這次呼叫将進入哪個 RTC 的頻道,兩個人進入同一個 RTC 頻道時,音視訊才會通。
"callUsers":callArray
//發送呼叫
rtmCallManager.sendLocalInvitation(localInvitation, null)
}
多人呼叫跟和點對點呼叫一樣,先建立 LocalInvitation,并且設定好必要的參數,隻不過多人是需要建立多個,在這裡我在自定義消息體裡多加了一個 callUsers,将所有呼叫的人userId都帶過去。這個可以讓收到呼叫的人知道有哪幾個人參與本次通話,并且可以根據這個資料提前加載好占位的View 并展示Loading動畫,接通後并且通過接收該視訊第一針回調後取消Loading動畫。
這裡需要注意的是要将建立好的所有 LocalInvitation放集合中儲存,後面取消呼叫,中途邀請人都需要用。
加入RTM頻道
這一步尤為重要,先說下加入 RTM 頻道的作用。
主叫在發起多人呼叫後,緊接着應該加入頻道,并且收到呼叫的人應該也第一時間加入RTM頻道。之是以要這麼做,是因為我們可以通過RTM 頻道幾個相當實用的回調,實作人員的添加移除管理。
//頻道内總人數更新
void onMemberCountUpdated(int var1);
//有人加入頻道
void onMemberJoined(RtmChannelMember var1);
//有人離開頻道
void onMemberLeft(RtmChannelMember var1);
onMemberLeft:前面我們已經知道,被叫收到呼叫,不論同意與否,都會會第一時間加入頻道。如果被叫拒絕的話,不僅需要調用 rejectRemoteInvitation 還需要調用RTM channel的 Leave方法。調了 Leave ,所有加入 RTM 頻道的成員都能知道這個使用者離開了,不在需要額外的消息通知。
onMemberJoined:人員加入頻道的回調,這個适用于如果中途邀請了别人加入通話,頻道内的其他人同樣會收到該使用者加入 RTM 頻道的回調,這時候就判斷該使用者是否有本地畫面,如果沒有可以在該回調添加這個人的視圖。
onMemberCountUpdated:當RTM頻道僅剩1個人的時候,這個時候就可以看作本次通話已經結束,執行相應的邏輯即可。
挂斷
- 如果還有未接聽的人員,主叫挂斷需周遊 LocalInvitation 集合,再調用 cancelLocalInvitation 取消每一個呼叫對象。已接聽的記得在LocalInvitation 集合中移除。如果業務邏輯是不區分主叫被叫,那麼就不需要調用cancelLocalInvitation,即使發起人挂斷,其他人還在的話,仍可以選擇同意或拒絕加入通話。
- 調用 RTM 頻道的 Leave ,其他人會收到 onMemberLeft,移除對應的視圖。
異常處理
- 有人不線上
- 可以過濾不線上的使用者,通過 queryPeersOnlineStatus查詢對方狀态。
- 接聽逾時
- 被叫遲遲不接聽,會回調 onLocalInvitationFailure方法,在這裡将其移除。
- 有人異常斷線
- 被叫接聽後異常斷線,前面可知,收到呼叫就會加入 RTM 頻道,如果異常斷線後,其他人會收到 onMemberLeft回調,可在這裡将其移除。
被叫
收到呼叫
在收到呼叫回調 onRemoteInvitationReceived後,首先要做的是 加入 RTM 頻道,這樣可以友善其他人處理邏輯,其次,主叫在建立 LocalInvitation對象的時候,加入了callUsers 字端,裡面包含本次呼叫的所有人員資訊。是以我們可以在此解析,并且儲存下來,用于後面頁面展示等其他業務邏輯。
同意
調用rtmCallManager.acceptRemoteInvitation(it, remoteInvitation)同意後,直接周遊 callUsers 在頁面上展示每個人的Loading視圖,再加入 RTC頻道,等收到其他人加入 RTC後取消Loading即可。
拒絕
調用rtmCallManager.refuseRemoteInvitation(it, remoteInvitation)的同時,也需要離開加入的 RTM 頻道。
挂斷
- 未接聽的情況下,先拒絕 refuseRemoteInvitation 本次呼叫邀請。
- 多人呼叫挂斷無需再發送信令通知其他人,隻需要離開之前加入的 RTM 頻道,其他人即可 通過 onMemberLeft知道這個人挂斷離開。
其他人離開
任何人離開都會先退出 RTM 頻道,是以在 onMemberLeft裡移除對應人員即可。
異常處理
其他使用者一直未接聽:
在 RTM SDK中,一個呼叫邀請的有效時間是60秒,是以,在展示其他人視圖的時候,為其設定一個倒計時。期間,如果他 加入了RTC頻道(意味着他同意了呼叫),就取消倒計時,隐藏Loading,展示他的視訊即可。
如果倒計時結束還未收到他加入RTC的回調,直接移除。
總結
以上就是多人呼叫的大概流程,其中需要注意的地方就是,收到呼叫或者發起呼叫都要先加入 RTM 頻道,
RTM頻道的ID由主叫建立,被叫在 RemoteInvitation 中解析。挂斷需離開RTM頻道。
基于上述流程,開發者可以根據該流程并參考DEMO快速實作多人音視訊呼叫通話。