跳到主要内容

实现音视频通话

CallKit 是在 CallLib 基础上,增加了一套默认呼叫界面的音视频呼叫功能 SDK,包含了单人、多人音视频呼叫的各种场景和功能,您可以快速的集成它来实现音视频呼叫场景。我们还提供了这个模块的开源代码GitHub · Gitee),您可以根据业务需要进行界面修改。

注意

房间人数上限

  1. 考虑移动设备的带宽(主要是在多路视频情况下)和 UI 交互效果,建议单次通话或房间内,视频不超过 16 人,纯音频不超过 32 人。超过此上限可能影响通话效果。
  2. CallKit 代码中已设置人数上限。默认发起视频呼叫时,最多可选 7 人。发起音频呼叫时,最多可选 20 人。如需调整,建议勿超过建议上限。
  3. CallKit 为开源 SDK,可自行修改上限(修改方法:RCCallmaxMultiVideoCallUserNumbermaxMultiAudioCallUserNumber)。

环境要求

  • iOS 9.0 及以上。
  • Xcode 9.0 或以上版本。

步骤 1:服务开通

您在融云创建的应用默认不会启用音视频服务。在使用融云提供的任何音视频服务前,您需要前往控制台,为应用开通音视频服务。

具体步骤请参阅 开通音视频服务

注意

服务开通、关闭等设置完成后 30 分钟后生效。

步骤 2:初始化

音视频 SDK 是基于即时通信 SDK 作为信令通道的,所以要先初始化 IM SDK。如果不换 AppKey,在整个应用生命周期中,初始化一次即可。建议调用位置放在应用启动位置处,或在音视频功能模块的加载位置处。

// 初始化 IM SDK
[[RCIM sharedRCIM] initWithAppKey:@"请在开发者平台获取AppKey"];

步骤 3:连接 IM 服务

音视频用户之间的信令传输依赖于融云的即时通信(IM)服务,因此需要先调用 connectWithToken 与 IM 服务建立好 TCP 长连接。建议在功能模块的加载位置处调用,之后再进行音视频呼叫业务。当模块退出后调用 disconnectlogout 断开该连接。

[[RCIM sharedRCIM] connectWithToken:@"从您服务器端获取的 Token"
dbOpened:^(RCDBErrorCode code) {
if (code != RCDBErrorCode_Success) {
// 数据库打开失败,处理
}
}
success:^(NSString *userId) {
// 连接成功,处理
}
error:^(RCConnectErrorCode status) {
// 连接失败,处理
}];

步骤 4:呼叫方

通常 App 内呼叫和被叫方逻辑会同时存在,所以需要分别集成。

发起单人呼叫

- (void)startSingleCall:(NSString *)targetId mediaType:(RCCallMediaType)mediaType;
参数类型必填说明
targetIdNSString对方的用户ID
mediaTypeRCCallMediaType媒体类型
  • 示例代码:

    [[RCCall sharedRCCall] startSingleCall:@"被叫端UserId" mediaType:RCCallMediaVideo];

发起多人呼叫

多人通话依赖群组 ConversationType_GROUP 或讨论组 ConversationType_DISCUSSION,被呼叫的用户必须在同一个群组里。

- (void)startMultiCallViewController:(RCConversationType)conversationType
targetId:(NSString *)targetId
mediaType:(RCCallMediaType)mediaType
userIdList:(NSArray *)userIdList;

  • 参数说明:

    参数类型必填说明
    conversationTypeRCConversationType会话类型 
    targetIdNSString群组ID
    mediaTypeRCCallMediaType媒体类型
    userIdListNSArray被叫用户ID列表
  • 示例代码:

    [[RCCall sharedRCCall] startMultiCallViewController:ConversationType_GROUP
    targetId:@"群组ID"
    mediaType:RCCallMediaVideo
    userIdList:@[@"被叫用户A", @"被叫用户B", @"被叫用户C"]];

选择成员发起通话

此方法会先弹出选择成员界面,选择完成后再使用上面的方法发起多人通话。如果您需要在群组中调用此接口发起多人会话,需要设置并实现 groupMemberDataSource

- (void)startMultiCall:(RCConversationType)conversationType
targetId:(NSString *)targetId
mediaType:(RCCallMediaType)mediaType;
  • 参数说明:

    参数类型必填说明
    conversationTypeRCConversationType会话类型 
    targetIdNSString群组ID
    mediaTypeRCCallMediaType媒体类型
  • 示例代码:

    [[RCCall sharedRCCall] startMultiCall:ConversationType_GROUP
    targetId:@"群组ID"
    mediaType:RCCallMediaVideo];

步骤 5:接听方

CallKit 中已经默认实现了 RongCallLib 库提供 RCCallReceiveDelegate(来电监听) 和 RCCallSessionDelegate(通话状态)代理。被叫端收到呼叫,会自动弹出通话界面,点击来电页面的接听按钮即可接听通话。

App 在后台或者未启动时会收到来电通知,点击来电通知条 App 打开后会显示来电页面。

定制化