跳到主要内容

一对一通话

本页介绍了一对一呼叫的主要功能,包括如何从您的应用程序拨打、接听、处理和结束呼叫。


关键类介绍

RCCallPlusClient

RCCallPlusClient: CallPlus for Web 的核心类,用于管理客户端呼叫行为,例如发起、接听、挂断通话,操作音视频设备,管理通话记录等。

方法说明
setCallPlusEventListener注册应用层事件,包含“收到呼叫、通话结束、通话人员状态变更、通话类型变更”等事件
setStatusReportListener注册音视频上下行丢包数据监听
setVideoView设置要观看人员(包括自己和对方)的媒体播放器
removeVideoView删除指定单个用户的媒体播放器,不观看指定单个用户的视频时,业务层可以直接移除其媒体播放器
playMedia播放指定人员的音视频媒体,播放指定单个用户的视频前,请确保已经调用 setVideoView 方法为其设置视频视图
createVideoConfigBuilder创建视频配置构建器
setVideoConfig设置视频配置
createAudioConfigBuilder创建音频配置构建器
setAudioConfig设置音频配置
startCall发起呼叫
joinMultiCall直接加入进行中的群组通话
invite通话中邀请他人
accept接听通话
hangup挂断通话
requestChangeMediaType通话中发起媒体类型变更请求
cancelChangeMediaType取消切换媒体类型变更请求
replyChangeMediaType媒体类型变更应答
getCurrentCallSession获取当前进行中的通话
getAvailableCallRecordsFromServer从服务器获取未结束的通话记录
getRemoteTracks获取远端资源列表
getCallRecords分页查找当前用户的全部通话记录
deleteCallRecordsFromServer根据 callId 集合批量删除通话记录
deleteAllCallRecordsFromServer清空所有通话记录
startCamera开启摄像头
stopCamera关闭摄像头
switchCamera切换摄像头
startMicrophone开启麦克风
stopMicrophone关闭麦克风
isMicrophoneEnable麦克风是否开启
muteAllRemoteAudio静音所有远端音频流
getVersion获取 SDK 版本信息

RCCallPlusSession

RCCallPlusSession 对象代表一则通话的所有信息,包含获取通话实体信息的方法集合。

方法说明
getCallId()获取通话 ID。
getState()获取通话实体的状态 RCCallPlusCallState
getCallType()获取通话类型 RCCallPlusType
getMediaType()获取通话媒体类型 RCCallPlusMediaType
getUserList()获取一组用户信息对象,每个对象中包含通话人员用户 ID 与用户状态 RCCallPlusSessionUserState
getCreatorUserId()获取通话发起者 userId
getInviterUserId()获取通话邀请者 userId
getCreateTimestamp()获取通话起始时间
getDuration()获取通话时长

ICallPlusEventListener

ICallPlusEventListener 监听器提供来电事件、通话状态、通话记录等事件相关回调。

方法说明
onReceivedCall本地用户收到来电通知。
onRemoteUserInvited本地用户收到收到远端人员被邀请加入通话通知,如 A 与 B 通话中,A 邀请 C,则 B 会收到此回调。inviteeUserList 表示受邀人用户 ID 列表。inviterUserId 表示邀请者用户 ID。callId 表示所属通话;群聊中,己方已不在通话中的情况下,也会收到服务侧的事件通知
onCallConnected通话已建立,sdk 内部会发布音视频资源
onCallTypeChanged本地用户收到通话类型变更通知。
onRemoteUserStateChanged本地用户收到人员状态变更通知。
onCallEnded本地用户收到通话结束(群组通话时,客户端挂断不代表通话结束)
onRemoteCameraStateChanged本地用户收到远端摄像头开、关通知
onRemoteMicrophoneStateChanged本地用户收到远端麦克风开、关通知
onReceivedCallLog本地用户单呼或群呼结束后,收到服务器下发的通话日志
onReceivedChangeMediaTypeRequest本地用户收到媒体类型变更请求(仅单聊)
onReceivedChangeMediaTypeResult本地用户收到媒体类型变更结果(仅单聊)
onReceivedCallStartTime本地用户收到收到通话开始计时通知
onReceivedCallFirstFrameTime本地用户收到收到通话首帧到达通知
onUserMediaAvailable本地用户收到指定单个用户的音频或视频可播放
onFetchRemoteMediaError收到获取本人或远端媒体资源失败
onUserAudioLevelChanged本地用户收到人员音量变化

呼叫流程

CallPlus SDK 中的一对一通话是指两人之间通话。一对一呼叫通过以下步骤建立:

  1. 主叫方发起呼叫,SDK 内部为主叫用户创建在音视频资源,以在通话中使用。被叫方会收到 onReceivedCall 通知。
  2. 当被叫方选择接听通话后,SDK 内部会为被叫用户创建音视频资源,以在通话中使用。
  3. 接听成功后,主叫方和被叫方的音视频资源将会被推送至融云媒体服务器。
  4. 融云信令服务器通知主叫方和被叫方可查看对方的音视频媒体资源。
  5. 主叫方和被叫方可以调 setVideoView 指定要观看的用户视频画面,SDK 内部会自动获取音频资源。
  6. 主叫方和被叫方可在 ICallPlusEventListener 监听器的 onUserMediaAvailable 事件中调 playMedia(useId,mediaType) 播放指定用户的音视频资源。注意:请务必根据用户 ID 和媒体类型进行判断,如果是本地用户采集的音频流,请不要在本端播放,避免造成回声或啸叫问题

对于主叫用户来说, 调用 startCall 方法后,将返回一个解析为 { code: RCCallPlusCode, callId?: string } 的 promise。对于被叫用户来说,将通过 ICallPlusEventListener 监听器的 onReceivedCall 方法收到 RCCallPlusSession 通话对象。对于主叫用户和被叫用户来说,都可以调用通话客户端 RCallPlusClient 对象的 getCurrentCallSession 方法获取当前进行中的通话对象。


前提条件

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

注册监听器

CallPlus for Web SDK 提供了 ICallPlusEventListener 事件处理程序,用于接收来自远端用户或服务端的事件,方便应用程序处理并做出反应。例如收到通话呼入时可选择接听或挂断、收到通话媒体类型升级请求时可选择同意或拒绝、收到通话开始计时可在页面显示通话时长。

获取 RCCallPlusClient 对象后,使用 setCallPlusEventListener() 注册监听器。

// 注册 callPlus 业务层监听事件
callPlusClient.setCallPlusEventListener({
/**
* 呼入通知
* 收到呼入时,可选择接听或挂断通话
* @param session 通话实例
* @param extra 透传呼叫方发起呼叫时携带的附加信息
*/
async onReceivedCall(session: RCCallPlusSession, extra?: string) {
const callId = session.getCallId();
console.log(`呼入通知, callId: ${callId}`);
/**
* 接听电话
*/
const { code } = await callPlusClient.accept(callId);
console.log(`接听通话结果, code: ${code}`);
},
/**
* 群组通话收到远端人员被邀请加入通话通知,如 A 与 B 通话中,A 邀请 C,则 B 会收到此回调
* @param inviteeUserList - 受邀人用户 ID 列表
* @param inviterUserId - 邀请者用户 ID
* @param callId - 所属通话;群聊中,己方已不在通话中的情况下,也会收到服务侧的事件通知
*/
onRemoteUserInvited(inviteeUserList: string[], inviterUserId: string, callId: string) {
console.log(`收到远端人员被邀请加入通话通知, callId: ${callId}, inviteeUserList: ${inviteeUserList}, inviterUserId: ${inviterUserId}`);
},
/**
* 通话已建立,sdk 内部会发布音视频资源
*/
onCallConnected(session: RCCallPlusSession) {
console.log(`通话已建立, callId: ${session.getCallId()}`);
},
/**
* 通话类型变更
* @param type 单呼或群呼
* @param callId 通话 id
*/
onCallTypeChanged(type: RCCallPlusType, callId: string) {
console.log(`通话类型变更, callId: ${callId}, type: ${type}`);
},
/**
* 人员状态变更
* @param callId 通话 id
* @param userId 状态变更人员 id
* @param state 人员变更后状态
* @param reason 变更原因
*/
onRemoteUserStateChanged(
// 增量
callId: string,
userId: string,
state: RCCallPlusSessionUserState,
reason?: RCCallPlusReason,
) {
console.log(`人员状态变更, callId: ${callId}, ${userId}状态: ${RCCallPlusSessionUserState[state]}, reason: ${reason}`);
},
/**
* 通话结束(群组通话时,客户端挂断不代表通话结束)
* @param session 通话实例
* @param reason 通话结束原因
*/
onCallEnded(session: RCCallPlusSession, reason: RCCallPlusReason) {
console.log(`通话结束, callId: ${session.getCallId()}, reason: ${reason}`);
},
/**
* 远端摄像头开、关通知
* @param callId 通话 id
* @param userId 用户 id
* @param disabled 是否关闭
*/
onRemoteCameraStateChanged(callId: string, userId: string, disabled: boolean) {
console.log(`远端摄像头开、关通知, callId: ${callId}, userId: ${userId}, disabled: ${disabled}`);
},
/**
* 远端麦克风开、关通知
* @param callId 通话 id
* @param userId 用户 id
* @param disabled 是否关闭
*/
onRemoteMicrophoneStateChanged(callId: string, userId: string, disabled: boolean) {
console.log(`远端m麦克风开、关通知, callId: ${callId}, userId: ${userId}, disabled: ${disabled}`);
},
/**
* 单呼或群呼结束后,服务器下发的通话日志
* @param record 数据接口定义为:IRCCallPlusCallRecord,可通过 apiDoc 查看具体包含字段
*/
onReceivedCallRecord(record: IRCCallPlusCallRecord) {
console.log(`通话日志下发, record: ${JSON.stringify(record)}`);
},
/**
* 收到媒体类型变更请求(仅单聊)
* @param userId 请求发起人
* @param transactionId 事物 id,本次请求和应答的唯一标识
* @param mediaType 请求变更的媒体类型
*/
onReceivedChangeMediaTypeRequest(
userId: string, transactionId: string, mediaType: RCCallPlusMediaType,
) {
console.log(`收到媒体类型变更请求, userId: ${userId}, transactionId: ${transactionId}, mediaType: ${mediaType}`);
/**
* 应答是否同意变更媒体请求
*/
const isAgree = true;
callPlusClient.replyChangeMediaType(transactionId, isAgree);
},
/**
* 媒体类型变更结果(仅单聊)
* @param info.userId
* @param info.transactionId 事物 id,本次请求和应答的唯一标识
* @param info.mediaType
* @param info.code - 升级结果
* - 升级成功
* - 发起升级请求方取消
* - 收到升级请求方拒绝
* - 响应超时
*/
onReceivedChangeMediaTypeResult(info: {
userId: string,
transactionId: string,
mediaType: RCCallPlusMediaType,
code: RCCallPlusMediaTypeChangeResult
}) {
const { userId, transactionId, mediaType, code } = info;
console.log(`媒体类型变更结果, userId: ${userId}, transactionId: ${transactionId}, mediaType: ${mediaType}, code: ${code}`);
},
/**
* 收到通话开始计时
* @param info.callId 通话 id
* @param info.callType 单聊或群聊
* @param info.callStartTime 通话开始时间
*/
onReceivedCallStartTime(info: { callId: string, callType: RCCallPlusType, callStartTime: number }) {
console.log(`通话计时开始, startTime: ${info.callStartTime}`);
/**
* 起通话计时定时器
*/
let callDuration = Math.floor((+new Date() - info.callStartTime) / 1000);
setInterval(() => { callDuration++; }, 1000);
},
/**
* 收到首帧时间(仅单聊存在)
* 收到首帧开始计费
* @param callId 通话 id
* @param callFirstFrameTime 通话首帧到达时间
*/
onReceivedCallFirstFrameTime(callId: string, callFirstFrameTime: number) {
console.log(`收到首帧时间, callFirstFrameTime: ${callFirstFrameTime}`);
},
/**
* 收到指定单个用户的音频或视频可播放
* 业务层可调 playMedia(userId, mediaType) 播放
* @param userId 用户 id
* @param mediaType 媒体类型
*/
onUserMediaAvailable(userId: string, mediaType: RCCallPlusMediaType) {
/**
* 请务必根据用户 ID 和媒体类型对流进行判断,如果是本地采集的音频流,请不要在本端播放,避免造成回声或啸叫问题。
*/
callPlusClient.playMedia(userId, mediaType);
},
/**
* 获取远端媒体资源失败
* @param userId 远端人员 id
* @param code 失败原因
*/
onFetchRemoteMediaError(userId: string, code: RCCallPlusCode) {
console.log(`获取远端媒体资源失败, userId: ${userId}, code: ${code}`);
},
/**
* 人员音量变化
* @param userId 本端或远端人员 id
* @param audioLevel 音量值(0-100)
*/
onUserAudioLevelChanged(userId: string, audioLevel: number) {
console.log(`人员音量变化, userId: ${userId}, audioLevel: ${audioLevel}`);
},
})

注意

如果未注册 ICallPlusEventListener 事件处理程序,则用户无法接收 onReceivedCall 通话呼入事件。建议在初始化 CallPlus SDK 后添加此处理程序。


添加媒体播放元素

视频媒体播放元素是一个 HTMLVideoElement <video> ,用于显示视频流。要显示本端和远程视频媒体流,以下两个元素是必需添加在页面中的。id 为 local_video_element_idvideo 标签用于播放本端视频,id 为 remote_video_element_idvideo 标签用于播放远端视频。音频播放依赖 SDK 内部创建的 Audio 对象,业务层无需关注。

<video id="local_video_element_id"></video>
<video id="remote_video_element_id"></video>

在页面准备好以上两个标签后,调 callPlusClient.setVideoView 可以设置要观看某些人的画面。如设置了要观看人员 A 的视频视图后,SDK 在获取到 A 的视频后,会在 ICallPlusEventListeneronUserMediaAvailable 事件通知业务层,此时业务层可调 callPlusClient.playMedia() 播放媒体资源(请勿在本端播放本地用户采集的音频流,避免造成回声或啸叫问题)。

/**
* 设置要观看人员(包括自己和对方)的媒体播放器
* @param list 为一个列表,可传入多人的媒体播放器
* @param item.userId 用户 id
* @param item.videoElement 一个 video 元素,用于播放视频,需要挂载在业务层页面上
* @param item.isTiny 是否观看别人的小流,小窗口时可以配置为 true,可节省带宽,userId 为远端用户时有效
* @returns code 返回是否设置成功
*/
setVideoView(list: {userId: string, videoElement: HTMLVideoElement, isTiny: boolean}[]): { code: RCCallPlusCode }

呼叫和接听前设置本端和远端的视频播放器。

callPlusClient.setVideoView([
{
userId: '<local-userId>',
videoElement: document.getElementById('local_video_element_id')
},
{
userId: '<remote-userId>',
videoElement: document.getElementById('remote_video_element_id')
},
]);

本端的视频播放器需在呼叫和接听前设置。远端人员的视频播放器可以按需设置,既可以在通话前提前设置好,也可以在 ICallPlusEventListeneronRemoteUserStateChanged 事件中,收到远端人员状态为 RCCallPlusSessionUserState.ONCALL 确认远端接通时设置,如果需要看远端人员的小流,可以指定 isTiny 为 true。


发起呼叫

注意

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

通过在 startCall 方法中提供被叫方的用户 ID、通话类型、通话媒体类型来发起呼叫。通话发起成功时,会返回成一个 callId

/**
* 发起呼叫
* @param userIds 被叫方人员 userId 列表,单人呼叫仅需在数组中放置对方一人的 userId
* @param type 单人呼叫 or 多人呼叫
* @param mediaType 通话媒体类型: 音频 or 音视频
* @returns callId 呼叫成功后,产生的会话 id
*/
callPlusClient.startCall(['<userId>'], RCCallPlusType.SINGLE, RCCallPlusMediaType.AUDIO_VIDEO);

接听电话

被叫方的客户端应用程序中必须已先注册 ICallPlusEventListener 才能收到来电事件 onReceivedCall 和通话中的其他事件。

使用 RCCallPlusClient 对象的 accepthangup 方法接听或拒绝呼叫。如果呼叫被接听,CallPlus SDK 将自动建立媒体会话。

callPlusClient.setCallPlusEventListener({
/**
* 呼入通知
* 收到呼入时,可选择接听或挂断通话
* @param session 通话实例
* @param extra 透传呼叫方发起呼叫时携带的附加信息
*/
async onReceivedCall(session: RCCallPlusSession, extra?: string) {
/**
* 接听电话
*/
const callId = session.getCallId();
const { code } = await callPlusClient.accept(callId);
console.log(`接听通话结果, code: ${code}`);
}
});

CallPlus SDK 通过与融云服务器的 IM 连接接收呼叫事件,该连接由 RongIMLib.connect() 建立。如果意外网络中断导致断开连接,SDK 内部会自动重新连接。


处理当前通话

音频

在通话过程中,主叫方和被叫方的音频都可以通过 RCCallPlusClient 对象的 stopMicrophonestartMicrophone 方法静音或取消静音。如果一方变更麦克风状态,另一方会通过 ICallPlusEventListener 监听器的 onRemoteMicrophoneStateChanged 监听器接收事件回调。

/**
* 开启麦克风
* @description 通话过程中打开麦克风,如果扩散资源失败,即对方没收到本端打开麦克风的通知时,此次行为失败
*/
async startMicrophone(): Promise<{ code: RCCallPlusCode }>

/**
* 关闭麦克风
* @description 通话过程中关闭麦克风,如果扩散资源失败,即对方没收到本端关闭麦克风的通知时,此次行为失败
*/
async stopMicrophone(): Promise<{ code: RCCallPlusCode }>

/**
* 切换麦克风
* 切换成功后 `ICallPlusEventListener` 监听器的 `onUserMediaAvailable` 中会收到新切换的麦克风资源可播放,此时调用 `callPlusClient.playMedia()` 可播放新麦克风的声音
* @param microphoneId 浏览器中取得的麦克风设备 id,可调 getMicrophones 方法取得
* @description 通话前和通话中都可调用
* @since 2.1.1
*/
async switchMicrophone(microphoneId: string): Promise<{ code: number }> {}

视频

在通话过程中,主叫方和被叫方的视频都可以通过 RCCallPlusClient 对象的 startCamerastopCamera 方法启用或禁用摄像头。如果一方变更摄像头状态,另一方会通过 ICallPlusEventListener 监听器的 onRemoteCameraStateChanged 接收事件回调。

/**
* 开启摄像头
* @description 通话过程中打开摄像头,如果扩散资源失败,即对方没收到本端打开摄像头的通知时,此次行为失败
*/
async startCamera(): Promise<{ code: RCCallPlusCode }>

/**
* 关闭摄像头
*/
async stopCamera(): Promise<{ code: RCCallPlusCode }>

/**
* 切换摄像头
* 切换成功后 `ICallPlusEventListener` 监听器的 `onUserMediaAvailable` 中会收到新切换的摄像头资源可播放,此时调用 `callPlusClient.playMedia()` 可显示新摄像头的画面
* @param cameraId 浏览器中取得的摄像头设备 id,可调 getCameras 方法取得
* @description 通话前和通话中都可调用
*/
async switchCamera(cameraId: string): Promise<{ code: number}> {}

还可以使用 switchCamera 切换摄像头,需指定设备 ID,切换成功后 ICallPlusEventListener 监听器的 onUserMediaAvailable 中会收到新切换的摄像头资源可播放,此时调用 callPlusClient.playMedia() 可显示新摄像头的画面

/**
* 切换摄像头
* @param cameraId 浏览器中取得的摄像头设备 id,可调 plugin-rtc 的 getCameras 方法取得,可参考:https://doc.rongcloud.cn/meeting/Web/5.X/device#cameras
* @description 通话前和通话中都可调用
*/
async switchCamera(cameraId: string): Promise<{ code: RCCallPlusCode}>

变更媒体类型

仅一对一通话支持在通话中变更媒体类型。

CallPlus SDK 定义了音视频通话 RCCallPlusMediaType.AUDIO_VIDEO 和音频通话 RCCallPlusMediaType.AUDIO 媒体类型。在一对一通话过程中,主叫方和被叫方都可以通过 requestChangeMediaType 方法来请求切换媒体类型。

/**
* 通话中发起媒体类型变更请求
* @param mediaType 媒体类型
* @returns transactionId 客户端和服务端交互的事务 id,在取消或应答媒体类型切换时传入
*/
async requestChangeMediaType(mediaType: RCCallPlusMediaType): Promise<{ code: RCCallPlusCode, transactionId?: string }>

发起请求变更媒体类型的一方,还可以通过 cancelChangeMediaType 方法来取消切换通话媒体类型的请求。

/**
* 取消切换媒体类型变更请求
* @param transactionId 客户端和服务端交互的事务 id,为发起媒体类型变更请求返回的 transactionId
*/
async cancelChangeMediaType(transactionId: string): Promise<{ code: RCCallPlusCode }>

远端用户会通过 ICallPlusEventListener 监听器的 onReceivedChangeMediaTypeRequest 方法收到媒体类型变更请求。收到请求后,通过 RCCallPlusClient 对象的 replyChangeMediaType 方法选择是否同意变更通话媒体类型。

/**
* 媒体类型变更应答
* @param transactionId 客户端和服务端交互的事务 id,为 onReceivedChangeToVideo 监听收到 transactionId 参数值
*/
async replyChangeMediaType(transactionId: string, isAgree: boolean): Promise<{ code: RCCallPlusCode }>

媒体类型变更最终的结果会通过 ICallPlusEventListener 监听器的 onReceivedChangeMediaTypeResult 方法通知请求方和确认方。

/**
* 媒体类型变更结果(仅单聊)
* @param info.userId
* @param info.transactionId 事物 id,本次请求和应答的唯一标识
* @param info.mediaType 最终的媒体类型
* @param info.code - 升级结果
* - 请求方取消媒体类型变更
* - 应答方拒绝媒体类型切换
* - 服务仲裁允许媒体类型切换
*/
onReceivedChangeMediaTypeResult(info: {
userId: string,
transactionId: string,
mediaType: RCCallPlusMediaType,
code: RCCallPlusMediaTypeChangeResult
}): void

结束通话

注意

从 CallPlus 2.0 开始,hangup 方法新增可选参数 pushConfig,支持携带移动端推送配置 IRCCallPlusPushConfig,可以用于自定义推送通知标题等属性。

挂断与拒绝接听动作均使用 RCCallPlusClient 对象的 hangup 方法,主叫用户或被叫用户都可以使用 hangup() 结束正在进行的通话。如果一方结束正在进行的通话,另一方会通过 ICallPlusEventListener.onCallEnded() 方法收到事件回调。

/**
* 挂断通话
* @param callId 为可选参数,不传时,挂断正在进行的主 session,传入时可指定挂断主通话或暂未建立连接的通话
* 暂未建立连接的通话:指已在通话中时,收到呼叫但暂未接听的通话
*/
async hangup(callId?: string): Promise<{ code: RCCallPlusCode }>

如果通话为一对一类型,一方挂断则双方同时挂断,融云将停止对通话计时计费。


在通话中接听来电

您可以在通话过程中接听来电。因为一次只能有一个活动呼叫,所以在接听新的来电时,SDK 内部会挂断正在进行中的通话。

注意

CallPlus SDK 不支持在通话过程中保持和恢复通话。

要接收来电,请使用 RCCallPlusClient 对象的 accept 方法,来电将变为当前通话。

/**
* 接听通话
* @param callId 通话 id
*/
async accept(callId: string): Promise<{ code: RCCallPlusCode }>

获取通话记录

通话结束后获取通话记录

通话结束(或拒接来电)后,ICallPlusEventListener.onReceivedCallRecord() 中会立马下发刚结束的通话记录。

/**
* 单呼或群呼结束后,服务器下发的通话日志
* @param record 数据接口定义为:IRCCallPlusCallRecord,可通过 apiDoc 查看具体包含字段
*/
onReceivedCallRecord(record: IRCCallPlusCallRecord): void

检索服务端通话记录

可以调 RCCallPlusClient 对象的 getCallRecords 方法主动从融云服务端获取用户的通话历史记录。

从 2.1.0 版本开始新增 order 参数,支持倒序查询通话记录。例如,分页获取最近的通话记录。首次可以将 syncTime 设置为 -1。如果需要继续查询,可以将返回的 syncTime 作为下次查询的 syncTime 值。

/**
* 分页查找当前用户的全部通话记录
* @param startTimestamp 起始时间戳,首次可传 -1
* @param count 每次获取的数量,最大 100
* @param order 正序或倒序获取,默认为正序。0 为正序,向开始时间戳之后查询。1 为倒序,向开始时间戳之前查询。
* @returns result.hasMore 是否有更多通话记录
* @returns result.list 通话记录列表,类型为 IRCCallPlusCallRecord[],可通过 apiDoc 查看具体包含字段
* @returns result.syncTime hasMore 为 true 时,继续获取通话记录需要传入该时间戳
*/
async getCallRecords(startTimestamp: number, count: number, order: 0|1 = 0): Promise<{ code: RCCallPlusCode, result?: IRCCallPlusGetCallRecordRes }>

管理音视频配置

CallPlus SDK 使用本地用户浏览器默认的摄像头与麦克风设备。默认视频分辨率为 W640_H480,帧率为 FPS_15。可以通过 RCVideoConfigBuilderRCAudioConfigBuilder 对象构建新的视频、音频配置项,再通过 RCCallPlusClientsetVideoConfigsetAudioConfig 使配置项生效。

设置本地视频采集配置

构建视频配置项

需先创建一个视频配置构建器 RCVideoConfigBuilder,使用 RCVideoConfigBuilder 可以配置视频分辨率、帧率、摄像头 id、视频传输码率。

import { RCResolution, RCFrameRate } from '@rongcloud/plugin-rtc';
/**
* createVideoConfigBuilder 创建视频配置构建器
* @returns RCVideoConfigBuilder 用于构造视频采集时的配置项,可以设置摄像头设备 id、帧率、分辨率等,
* 设置完需调 build 方法,最终在 setVideoConfig 后生效
*/
const videoConfigBuilder = callPlusClient.createVideoConfigBuilder();

// 配置分辨率
videoConfigBuilder.setVideoResolution(RCResolution.W640_H360)
// 配置帧率
.setFrameRate(RCFrameRate.FPS_24)
/**
* 配置摄像头Id
* cameraId 取值可参考 https://doc.rongcloud.cn/rtc/Web/5.X/device#%E8%8E%B7%E5%8F%96%E6%91%84%E5%83%8F%E5%A4%B4%E8%AE%BE%E5%A4%87%E5%88%97%E8%A1%A8
*/
.setDefaultCameraId(cameraId)
/**
* 设置最小、最大码率
* 单位 kbps
* 不设置时,取动态码率计算结果
* @param min 最小码率
* @param max 最大码率
*/
.setBitrate(min, max);

// 构建视频配置
const videoConfig = videoConfigBuilder.build();

设置视频配置项

/**
* 设置视频配置
* 下次采集时生效,如切换摄像头、重新建立通话
*/
callPlusClient.setVideoConfig(videoConfig);

修改本地音频采集配置

需先创建一个音频配置构建器 RCAudioConfigBuilder,使用 RCAudioConfigBuilder 可以配置麦克风 id、音频采样率、音频传输码率。

构建音频配置项

/**
* 创建音频配置构建器
* @returns RCAudioConfigBuilder 用于构造音频采集时的配置项,可以设置麦克风设备 id
* 设置完需调 build 方法,最终在 setAudioConfig 后生效
*/
const audioConfigBuilder = callPlusClient.createAudioConfigBuilder();

/**
* 指定默认麦克风
* microphoneId 取值可参考 https://doc.rongcloud.cn/rtc/Web/5.X/device#%E8%8E%B7%E5%8F%96%E9%BA%A6%E5%85%8B%E9%A3%8E%E8%AE%BE%E5%A4%87%E5%88%97%E8%A1%A8
*/
audioConfigBuilder.setDefaultMicrophoneId(microphoneId);
/**
* 设置最小、最大码率
* 单位 kbps
* 不设置时,取动态码率计算结果
* @param min number 最小码率
* @param max number 最大码率
*/
.setBitrate(min, max);
/**
* 设置音频采样率
* @param sampleRate number 音频采样率
*/
.setSampleRate(sampleRate);

// 构建音频配置
const audioConfig = audioConfigBuilder.build();

设置音频配置项

/**
* 设置音频配置
* 下次采集时生效,如重新建立通话
*/
callPlusClient.setAudioConfig(audioConfig);

管理通话质量

用户可以收到有关通话质量变化的通知,以便他们可以检查自己的网络连接,以避免在通话过程中出现任何中断。

设置 IStatusReportListener

要检测通话质量的变化,需要设置 IStatusReportListener。调用 RCCallPlusClient 对象的 setStatusReportListener() 可设置通话质量监听事件。

/**
* 注册音视频上下行丢包数据监听
* 每秒上报一次
* @param listener 类型为 IStatusReportListener,详细定义可参考 apiDoc
* @param listener.onSendPacketLoss 发送丢包率信息回调
* @param listener.onReceivePacketLoss 接收丢包率信息回调
*/
setStatusReportListener(listener: IStatusReportListener)

IStatusReportListener 说明

方法说明
onSendPacketLoss(packetLostRate: number, delay: number): voidpacketLostRate 丢包率,0-100,delay 发送端的网络延迟,单位毫秒,每秒上报一次
onReceivePacketLoss(data: { [userId: string]: RCCallPlusPacketLossStats }): voiddata[userId].packetLostRate 丢包率:取值范围是 0-100,data[userId].bitRate 码率大小,单位是 kbps