CallLib 5.0
基于融云 IMLib 与 RTCLib 能力构建的音视频通话场景 SDK,基于该 SDK,开发者可快速实现音视频呼叫功能的开发。
RFC
初始化
import { IMClient, init } from '@rongcloud/imlib-v4'
import { installer as rtcInstaller, RCRTCClient, RCTrack, IMicphoneAudioProfile, ICameraVideoProfile, } from "@rongcloud/plugin-rtc";
import { installer as callInstaller, RCCallClient, RCCallSession, RCCallErrorCode, IEndSummary, ISender, RCCallLanguage, RCCallEndReason} from "@rongcloud/plugin-call";
// im 客户端初始化
const imClient: IMClient = init({ ... })
// rtc 客户端初始化
const rtcClient: RCRTCClient = imClient.install(rtcInstaller, { ...options })
// calllib 客户端初始化
const caller: RCCallClient = imClient.install(callInstaller, {
// rtcClient 实例
rtcClient,
// 监听被叫
onSession (session: RCCallSession) {
// session
},
// 通话终止
onSessionClose (session: RCCallSession, summaryInfo: IEndSummary) {
// session
},
// 其他初参数
...options
})
注册用户数据
通过发消息携带用户信息功能,将用户信息通知到对端。不注册的前提下,对端只能收到人员 id 数据
// 注册用户数据,对端收到相应通知时可携带数据,多次注册时以最后一次注册为准
caller.registerUserInfo({ name, profile, extra })
主动呼叫
- 单呼
/**
* 单呼,发送invite消息, 成工后返回session
* @param params.targetId 被呼叫一方的用户 id 必填
* @param params.mediaType 音频呼叫 or 音视频呼叫 必填
* @param params.listener (session上的监听) 必填
* @param params.constraints 获取音频或音视频资源时的参数 可选
* @param params.channelId 组织 Id 可选
*/
const { code, session } = await caller.call({
targetId: this.targetId,
mediaType,
listener: {
/**
* 当对方已响铃
*/
onRinging: (sender: ISender, session: RCCallSession) => {},
/**
* 当对方已同意
*/
onAccept: (sender: ISender, session: RCCallSession) => {},
/**
* 当对方已挂断
*/
onHungup: (sender: ISender, reason: RCCallEndReason, session: RCCallSession) => {},
/**
* 群组通话,人员改变
*/
onMemberModify: (sender: ISender, invitedUsers: IInvitedUsers[], session: RCCallSession) => {},
/**
* 通话降级
*/
onMediaModify: (sender: ISender, mediaType: RCCallMediaType, session: RCCallSession) => {},
/**
* 当接到流
*/
onTrackReady: (track: RCTrack, session?: RCCallSession) => {};
/**
* 关闭 或 开启 音频
*/
onAudioMuteChange: (muteUser: IMuteUser, session: RCCallSession) => {},
/**
* 关闭 或 开启 视频
*/
onVideoMuteChange: (muteUser: IMuteUser, session: RCCallSession) => {},
}
});
if (code === RCCallErrorCode.SUCCESS) {
......
}
- 群呼
/**
* 发起群组呼叫
* @param params.targetId 群组 Id 必填
* @param params.userIds 被呼叫的群内成员 Id 必填
* @param params.mediaType 音频呼叫 or 音视频呼叫 必填
* @param params.listener (session上的监听) 必填
* @param params.channelId 组织 Id 可选
* @param params.constraints 获取音频或音视频资源时的参数 可选
*/
const { code, session } = await caller.callInGroup({
targetId: this.targetId,
userIds,
mediaType,
listener: {
/**
* 当对方已响铃
*/
onRinging: (sender: ISender, session: RCCallSession) => {},
/**
* 当对方已同意
*/
onAccept: (sender: ISender, session: RCCallSession) => {},
/**
* 当对方已挂断
*/
onHungup: (sender: ISender, reason: RCCallEndReason, session: RCCallSession) => {},
/**
* 群组通话,人员改变
*/
onMemberModify: (sender: ISender, invitedUsers: IInvitedUsers[], session: RCCallSession) => {},
/**
* 通话降级
*/
onMediaModify: (sender: ISender, mediaType: RCCallMediaType, session: RCCallSession) => {},
/**
* 当接到流
*/
onTrackReady: (track: RCTrack, session?: RCCallSession) => {},
/**
* 关闭 或 开启 音频
*/
onAudioMuteChange: (muteUser: IMuteUser, session: RCCallSession) => {},
/**
* 关闭 或 开启 视频
*/
onVideoMuteChange: (muteUser: IMuteUser, session: RCCallSession) => {}
}
});
if (code === RCCallErrorCode.SUCCESS) {
}
RCCallSession
RCCallSession 是 CallLib 业务的单次呼叫所建立的会话场景的抽象,标识当前的通话
// 当前通话的唯一性标识
session.getSessionId()
// targetId,群呼为群组 Id,单呼为对方人员 Id
session.getTargetId()
// 获取会话类型
session.getConversationType()
// 多组织功能相关
session.getChannelId()
// 房间人员列表,不包含本端信息
session.getRemoteUsers()
// 获取人员状态:等待 | 通话中 | 结束
session.getUserState(userId)
// 会话状态:呼入等待 | 呼出等待 | 通话中 | 通话已结束
session.getState()
// 获取会话发起者 Id
session.getCallerId(): Promise<string | undefined>
// 注册会话事件监听
session.registerSessionListener({
/**
* 当对方已响铃
*/
onRinging: (sender: ISender, session: RCCallSession) => {},
/**
* 当对方已同意
*/
onAccept: (sender: ISender, session: RCCallSession) => {},
/**
* 当对方已挂断
*/
onHungup: (sender: ISender, reason: RCCallEndReason, session: RCCallSession) => {},
/**
* 群组通话,人员改变
*/
onMemberModify: (sender: ISender, invitedUsers: IInvitedUsers[], session: RCCallSession) => {},
/**
* 通话降级
*/
onMediaModify: (sender: ISender, mediaType: RCCallMediaType, session: RCCallSession) => {},
/**
* 本端资源或远端资源已获取,track为本地音频或音视频, track不可设置成Vue组件的响应式数据
* track.isLocalTrack() 是否为本地资源
* track.isAudioTrack() 是否为音频
* track.isVideoTrack() 是否为视频
* track.getUserId() 产生该流的用户id
*/
onTrackReady: (rcTrack: RCTrack, session?: RCCallSession) => {
// 用户资源已获取,包含己方资源
rcTrack.play('#video')
},
/**
* 关闭 或 开启 音频
*/
onAudioMuteChange: (muteUser: IMuteUser, session: RCCallSession) => {},
/**
* 关闭 或 开启 视频
*/
onVideoMuteChange: (muteUser: IMuteUser, session: RCCallSession) => {}
})
// 继续邀请其他人,groupOnly
session.invite(userIds): Promise<{code}>
// 接听(callin only)
session.accept(constraints?: { audio?: IMicphoneAudioProfile; video?: ICameraVideoProfile })
// 挂断
session.hungup()