跳到主要内容

多人通话

CallPlus SDK 提供了支持多人呼叫的通话类型 RCCallPlusType.GROUP。本文介绍了多人通话的主要功能,包括如何发起多人通话、单人通话转为多人通话等。

注意

因为 CallPlus for Web 多人通话与一对一通话流程相似,本文仅介绍多人通话与一对一通话有差异的使用方法。我们建议您先按照一对一通话实现完整的通话流程。

前提条件

  • App Key 已开通音视频通话服务。
  • 已初始化 CallPlus SDK,并获取 RCCallPlusClient 对象。本文中的 callPlusClient 即为初始化时获取的 RCCallPlusClient 对象。

发起多人通话

注意

从 CallPlus 2.0 开始,startCall 方法新增可选参数 pushConfigextrapushConfig 支持携带移动端推送配置 IRCCallPlusPushConfig,可用于自定义推送通知标题等属性 extra 支持携带透传的自定义数据。

如需直接发起多人通话,请在 startCall 方法中传入多个远端用户 ID,并设置通话类型为 RCCallPlusType.GROUP。媒体类型可为视频或音频。您可以创建最多 16 名视频参与者的多人通话,或最多 32 名音频参与者的多人通话。该方法会通过 Promise 返回 RCCallPlusCodecallId。被叫用户会通过 ICallPlusEventListeneronReceivedCall(session: RCCallPlusSession) 方法收到来电通知。

typescript
const { code, callId } = await callPlusClient.startCall(['<userId1>', '<userId2>'], RCCallPlusType.MULTI, RCCallPlusMediaType.AUDIO_VIDEO);

注意

多人通话一旦发起成功,融云即开始计时计费。


接听多人通话

注意

被叫用户必须已设置 ICallPlusEventListener 监听器,并实现 onReceivedCall(session: RCCallPlusSession) 方法。被叫用户通过与融云的 IM 连接接收来电通知。

被叫用户收到来电通知后,可以选择接听或拒绝来电。应用程序可以通过 RCCallPlusSessiongetCallId() 方法获取通话 ID,可以通过 getCallType() 方法查询通话类型是否为多人通话。

  • 接听来电,使用 RCCallPlusClient 对象的 accept(callId) 方法,或者 joinCall(callId) 方法。
  • 挂断来电,使用 RCCallPlusClient 对象的 hangup(callId) 方法。

接听方法、加入通话方法与挂断方法在 SDK 内部为异步执行,API 会通过 Promise 返回调用结果 RCCallPlusCode,为 0 表示成功。


邀请他人加入通话

您可以向某些用户发送邀请来让用户进入多人通话。被邀请者可以接受或拒绝您的邀请。

注意

CallPlus 暂不支持取消邀请。

邀请用户

注意

从 CallPlus 2.0 开始,invite 方法新增可选参数 pushConfigextrapushConfig 支持携带移动端推送配置 IRCCallPlusPushConfig,可用于自定义推送通知标题等属性 extra 支持携带透传的自定义数据。

首先,本地用户需要已进入一个多人通话或一对一通话。要邀请其他用户,使用 invite 方法,并传入用户 ID。本地用户可通过返回的 Promise 获取调用结果。Promise 中的 busyUsers 参数表示忙线的用户列表。

typescript
/**
* 通话中邀请他人
* 单人通话中邀请他人会引发通话类型变更
* @param userIds 被邀请人列表
* @returns busyUsers 返回忙线人员列表
*/
async invite(userIds: string[]): Promise<{ code: RCCallPlusCode, busyUsers?: RCCallPlusCallUser[] }>

成功发送邀请后,受邀用户的设备上将通过 ICallPlusEventListener 监听器的 onReceivedCall(RCCallPlusSession callSession) 方法收到来电通知,通知他们您已邀请他们加入通话。

获取邀请详情

在通话中发起邀请后,被邀请者、正在通话中的用户、已退出多人通话的用户都将通过 ICallPlusEventListener 监听器的 onRemoteUserInvited 方法收到通知,其中携带通话 ID、发起邀请者用户 ID 与所有受邀用户的 ID。

typescript
/**
* 群组通话收到远端人员被邀请加入通话通知,如 A 与 B 通话中,A 邀请 C,则 B 会收到此回调
* @param inviteeUserList - 受邀人用户 ID 列表
* @param inviterUserId - 邀请者用户 ID
* @param callId - 所属通话;群聊中,己方已不在通话中的情况下,也会收到服务侧的事件通知
*/
onRemoteUserInvited(inviteeUserList: string[], inviterUserId: string, callId: string):void

接受或拒绝邀请

当被邀请的用户接受或拒绝邀请时,邀请他们的用户将会收到通知。您可以添加 UI 更新,让邀请者知道他们邀请的用户是接受还是拒绝邀请。

  • 被邀请者接受邀请,可以使用 RCCallPlusClient 对象的 accept(callId) 方法接听来电,或者 joinCall(callId) 方法加入多人通话。
  • 被邀请者拒绝邀请,可以使用 您的 RCCallPlusClient 对象的 hangup(callId) 方法挂断来电。

接听方法与挂断方法在 SDK 内部为异步执行,调用结果会通过 Promise 返回 RCCallPlusCode,为 0 表示成功。

被邀请者进入通话后,邀请者和被邀请者将能够查看彼此的媒体流。

如果原通话是一对一通话,受邀请者加入后,通话类型将变更为 RCCallPlusType.GROUP,通话参与者(包括已退出的用户)都会通过 onCallTypeChanged 方法收到通知。


获取未结束的多人通话

用户可能拒绝一个多人通话邀请,或退出一个多人通话,只要该多人通话未结束,用户就可以再次加入。

首先,使用 getAvailableCallRecordsFromServer 方法向服务端查询本地用户所有曾经参与过(或曾经被邀请过)、且仍在进行中的多人通话。

typescript
/**
* 从服务器获取未结束的通话记录
* @returns records 一组未结束的通话记录
*/
async getAvailableCallRecordsFromServer(): Promise<{ code: RCCallPlusCode, records?: IRCCallPlusCallRecord[] }>

该方法返回一个 Promise 其中包含调用结果码与 IRCCallPlusCallRecord 对象列表。获取未结束通话的记录后,通过 IRCCallPlusCallRecordgetCallId() 方法获取通话 ID,使用 joinCall 方法传入通话 ID 可加入正在进行中的多人通话。

群呼通话消息

在同一个群组中的多人通话,可以通过呼叫时指定群组 id、注册 onReceivedGroupCallStatusMessage 监听,收到群组通话开始和结束的消息,可用于在 IM 聊天界面插入通话开始和结束消息。实现此功能需要完成以下两个步骤:

  1. RCCallPlusClient 调用 startCall 方法时,指定参数 targetId 为共同的群组 id
typescript
/**
* 发起呼叫
* @param userIds 被叫人员 userId 列表,单人呼叫仅需在数组中放置对方一人的 userId
* @param type 单人呼叫或多人呼叫
* @param mediaType 通话媒体类型: 音频或音视频
* @param pushConfig 移动端推送信息(可选)
* @param extra 附加信息,会透传给被呼叫方(可选)
* @param targetId 多人通话时,共同所在的群组 ID (可选)
* @description 重试逻辑:信令发送失败时,sdk 内部会间隔 2 秒重试一次,直到成功或超过,超时时间为一分钟
* @returns callId 呼叫成功后,产生的会话 ID
*/
async startCall(userIds: string[], callType: RCCallPlusType = RCCallPlusType.SINGLE, mediaType: RCCallPlusMediaType = RCCallPlusMediaType.AUDIO_VIDEO, pushConfig?: IRCCallPlusPushConfig, extra?: string, targetId?: string): Promise<{ code: number, callId?: string }>
  1. 注册监听群组通话开始、结束消息,通过 RCCallPlusClient 上的 setCallPlusEventListener 方法注册 onReceivedGroupCallStatusMessage 事件,消息体内容可参考 IRCCallPlusGroupCallStatusMessageContent
typescript
/**
* 收到群组通话开始和结束的消息,可用于在 IM 聊天界面插入通话开始和结束消息
* 触发条件:
* 1.仅在同一个群组中的人员可收到
* 2.需在发起呼叫时设置 targetId 参数,targetId 为群组 ID。
* 触发时机:
* 1.群组通话开始或结束后
* 2.离线时群组里产生新通话,重新连接 IM 在线时
* @param message 通话记录的消息体
*/
onReceivedGroupCallStatusMessage?(message: IReceivedGroupCallStatusMessage): void