实现音视频通话
CallKit 是在 CallLib 基础上,增加了一套默认呼叫界面的音视频呼叫功能 SDK,包含了单人、多人音视频呼叫的各种场景和功能,您可以快速的集成它来实现音视频呼叫场景。我们还提供了这个模块的开源代码(GitHub · Gitee),您可以根据业务需要进行界面修改。
注意
房间人数上限
- 考虑移动设备的带宽(主要是在多路视频情况下)和 UI 交互效果,建议单次通话或房间内,视频不超过 16 人,纯音频不超过 32 人。超过此上限可能影响通话效果。
- CallKit 代码中已设置人数上限。默认发起视频呼叫时,最多可选 7 人。发起音频呼叫时,最多可选 20 人。如需调整,建议勿超过建议上限。
- CallKit 为开源 SDK,可自行修改上限(修改方法:
RCCall
的 maxMultiVideoCallUserNumber 与 maxMultiAudioCallUserNumber)。
环境要求
- 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 长连接。建议在功能模块的加载位置处调用,之后再进行音视频呼叫业务。当模块退出后调用 disconnect
或 logout
断开该连接。
[[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;
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
targetId | NSString | 是 | 对方的用户ID |
mediaType | RCCallMediaType | 是 | 媒体类型 |
-
示例代码:
[[RCCall sharedRCCall] startSingleCall:@"被叫端UserId" mediaType:RCCallMediaVideo];
发起多人呼叫
多人通话依赖群组 ConversationType_GROUP
或讨论组 ConversationType_DISCUSSION
,被呼叫的用户必须在同一个群组里。
- (void)startMultiCallViewController:(RCConversationType)conversationType
targetId:(NSString *)targetId
mediaType:(RCCallMediaType)mediaType
userIdList:(NSArray *)userIdList;
-
参数说明:
参数 类型 必填 说明 conversationType RCConversationType 是 会话类型 targetId NSString 是 群组ID mediaType RCCallMediaType 是 媒体类型 userIdList NSArray 是 被叫用户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;
-
参数说明:
参数 类型 必填 说明 conversationType RCConversationType 是 会话类型 targetId NSString 是 群组ID mediaType RCCallMediaType 是 媒体类型 -
示例代码:
[[RCCall sharedRCCall] startMultiCall:ConversationType_GROUP
targetId:@"群组ID"
mediaType:RCCallMediaVideo];
步骤 5:接听方
CallKit 中已经默认实现了 RongCallLib 库提供 RCCallReceiveDelegate(来电监听) 和 RCCallSessionDelegate(通话状态)代理。被叫端收到呼叫,会自动弹出通话界面,点击来电页面的接听按钮即可接听通话。
当 App
在后台或者未启动时会收到来电通知,点击来电通知条 App
打开后会显示来电页面。
定制化
- 接入扩展插件:CallKit 可以接入官方美颜插件或相芯美颜插件。注意,相芯美颜插件要求 CallKit 版本 ≧ 5.4.0。详见 CallLib 文档美颜插件。
- 如何获取 RCCallSession:RongCallKit 非源码如何获取 RCCallSession