跳到主要内容

实现音视频通话

CallLib 是在 RTCLib 基础上,额外封装了一套音视频呼叫功能 SDK,包含了单人、多人音视频呼叫的各种场景和功能,通过集成它,您可以自由的实现音视频呼叫的各种场景。

注意

房间人数上限

考虑移动设备的带宽(主要是在多路视频情况下),建议单次通话或房间内,视频不超过 16 人,纯音频不超过 32 人。超过此上限可能影响通话效果。

环境要求

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

步骤 1:服务开通

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

具体步骤请参阅控制台文档开通音视频服务

注意

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

步骤 2:初始化

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

[[RCCoreClient sharedCoreClient] initWithAppKey:@"从控制台申请的 AppKey"];

步骤 3:通话事件处理

监听通话呼入

  1. 初始化 RongCallLib 后可收到 RCCallReceiveDelegate 的来电回调。

    [[RCCallClient sharedRCCallClient] setDelegate:"RCCallReceiveDelegate 的实现类"];
  2. RCCallClient 中定义了全局通话呼入的监听器 RCCallReceiveDelegate 设置并实现此代理方法即可收到来电。

    - (void)didReceiveCall:(RCCallSession *)callSession;

监听通话状态变化

RCCallSession 中定义了 RCCallSessionDelegate,支持监听通话状态的变化。获取 RCCallSession 对象后,可以通过 RCCallSession 的如下方法添加代理。

/*!
添加通话状态的监听器, 支持多代理

@param delegate 通话状态变化的监听器
@discussion
添加通话状态的监听器, 支持多代理

@remarks 通话设置
*/
- (void)addDelegate:(id<RCCallSessionDelegate>)delegate;

/**
删除通话状态的监听器

@param delegate 通话状态的监听器
@discussion
删除通话状态的监听器

@remarks 通话设置
*/
- (void)removeDelegate:(id<RCCallSessionDelegate>)delegate;

通话计时

CallLib SDK 无法直接获取通话时长。您可以在 RCCallSessionDelegate 的音频或视频首帧回调中,使用当前时间减去通话起始时间,获取通话时长。

代理方法:

- (void)receiveRemoteUserVideoFirstKeyFrame:(NSString *)userId {
// 视频通话在此处开启一个定时器
}

- (void)receiveRemoteUserVideoFirstAudioFrame:(NSString *)userId {
// 音频通话在此处开启一个定时器
}

您可以在定时器中使用以下方法,获取当前通话的秒数:

long sec = ([[NSDate date] timeIntervalSince1970] * 1000 - [RCCallClient sharedRCCallClient].currentCallSession.connectedTime) / 1000;

提示

如需在应用程序的服务端进行通话计时,建议使用融云提供的服务端回调音视频房间状态同步。通过实时回调事件 event 11(成员加入音视频房间)和 event 12(成员加入音视频房间)记录计费的开始和结束时间。

步骤 4:连接 IM 服务

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

// 连接 IM 服务
[[RCCoreClient sharedCoreClient] connectWithToken:@"从您服务器端获取的 Token"
dbOpened:^(RCDBErrorCode code) {}
success:^(NSString *userId) {}
error:^(RCConnectErrorCode status) {}];

步骤 5:发起呼叫

使用 RCCallClientstartCall:targetId:to:mediaType:sessionDelegate:extra: 可以对指定对象发起呼叫请求。

self.callSession = [[RCCallClient sharedRCCallClient] startCall:conversationType
targetId:targetId
to:userIdList
mediaType:mediaType
sessionDelegate:self
extra:nil];

步骤 6:呼叫接听

当需要接听通话时,利用发起呼叫返回的 callSession 或来电代理返回的 callSession 对象调用接听方法。

[self.callSession accept:self.callSession.mediaType];

步骤 7:挂断

当需要挂断通话时,利用发起呼叫返回的 callSession 或来电代理返回的 callSession 对象调用挂断方法。

[self.callSession hangup];