天天看點

Android技術分享|視訊通話開發流程(二)

作者:anyRTC雲平台

多人呼叫

多人呼叫與點對點呼叫差別在于多人呼叫是一次呼叫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個人的時候,這個時候就可以看作本次通話已經結束,執行相應的邏輯即可。

挂斷

  1. 如果還有未接聽的人員,主叫挂斷需周遊 LocalInvitation 集合,再調用 cancelLocalInvitation 取消每一個呼叫對象。已接聽的記得在LocalInvitation 集合中移除。如果業務邏輯是不區分主叫被叫,那麼就不需要調用cancelLocalInvitation,即使發起人挂斷,其他人還在的話,仍可以選擇同意或拒絕加入通話。
  2. 調用 RTM 頻道的 Leave ,其他人會收到 onMemberLeft,移除對應的視圖。

異常處理

  1. 有人不線上
  2. 可以過濾不線上的使用者,通過 queryPeersOnlineStatus查詢對方狀态。
  3. 接聽逾時
  4. 被叫遲遲不接聽,會回調 onLocalInvitationFailure方法,在這裡将其移除。
  5. 有人異常斷線
  6. 被叫接聽後異常斷線,前面可知,收到呼叫就會加入 RTM 頻道,如果異常斷線後,其他人會收到 onMemberLeft回調,可在這裡将其移除。

被叫

收到呼叫

在收到呼叫回調 onRemoteInvitationReceived後,首先要做的是 加入 RTM 頻道,這樣可以友善其他人處理邏輯,其次,主叫在建立 LocalInvitation對象的時候,加入了callUsers 字端,裡面包含本次呼叫的所有人員資訊。是以我們可以在此解析,并且儲存下來,用于後面頁面展示等其他業務邏輯。

同意

調用rtmCallManager.acceptRemoteInvitation(it, remoteInvitation)同意後,直接周遊 callUsers 在頁面上展示每個人的Loading視圖,再加入 RTC頻道,等收到其他人加入 RTC後取消Loading即可。

拒絕

調用rtmCallManager.refuseRemoteInvitation(it, remoteInvitation)的同時,也需要離開加入的 RTM 頻道。

挂斷

  1. 未接聽的情況下,先拒絕 refuseRemoteInvitation 本次呼叫邀請。
  2. 多人呼叫挂斷無需再發送信令通知其他人,隻需要離開之前加入的 RTM 頻道,其他人即可 通過 onMemberLeft知道這個人挂斷離開。

其他人離開

任何人離開都會先退出 RTM 頻道,是以在 onMemberLeft裡移除對應人員即可。

異常處理

其他使用者一直未接聽:

在 RTM SDK中,一個呼叫邀請的有效時間是60秒,是以,在展示其他人視圖的時候,為其設定一個倒計時。期間,如果他 加入了RTC頻道(意味着他同意了呼叫),就取消倒計時,隐藏Loading,展示他的視訊即可。

如果倒計時結束還未收到他加入RTC的回調,直接移除。

總結

以上就是多人呼叫的大概流程,其中需要注意的地方就是,收到呼叫或者發起呼叫都要先加入 RTM 頻道,

RTM頻道的ID由主叫建立,被叫在 RemoteInvitation 中解析。挂斷需離開RTM頻道。

基于上述流程,開發者可以根據該流程并參考DEMO快速實作多人音視訊呼叫通話。

Android技術分享|視訊通話開發流程(二)

繼續閱讀