# 实现视频客服

本文档为您展示通过 SDK 实现视频客服(含排队机)的相关步骤,帮助您在远程银行和视频客服的场景下实现智能排队、座席转接、全景录像、座席管理的相关能力。

# 坐席签入

登录视频能力平台成功后,需要签入到排队机才能由排队机进行路由分配。

[_agent checkin:JCAgentRoleTypeManager];

Checkin (opens new window) 接口包含几个重载,用来适应各种可配置的参数,比如签入后默认为示闲还是示忙、比如坐席的角色。这些接口的使用结合具体的需求来使用。

Checkin (opens new window) 的结果将会通过实现 JCAgentCallback (opens new window) 中的 onCheckinResult (opens new window) 接口上报。

- (void)onCheckinResult:(bool)result {
    if (result) {
        // 签入成功
    } else {
        // 签入失败
    }
}

# 通话状态通知

坐席签入成功后即为一个等待通话接入的状态,这个时候如果收到来电,将会通过实现 JCAgentCallback (opens new window) 中的 OnCallStateChanged (opens new window) 的接口上报。

- (void)onCallStateChanged:(JCAgentCallStateChangeType)type participant:(JCMediaChannelParticipant *)part reason:(JCAgentTermReason)JCAgentTermReason {
    switch (type) {
        case JCAgentCallStateChangeTypeIncoming:
            // 收到呼叫
            break;
        case JCAgentCallStateChangeTypeTalking:
            // 通话建立
            break;
        case JCAgentCallStateChangeTypeTermed:
            // 通话结束
            break;
    }
}

# 接听来电

在坐席收到来电的通知后,可以通过调用接听接口来接起访客的呼叫。

[_agent answer];

接听的结果同样通过 OnCallStateChanged (opens new window) 接口上报。

# 创建本地视频画面

创建本地视频画面的时机没有具体要求,在通话前或通话中皆可。

JCMediaDeviceVideoCanvas *canvas = [_mediaDevice startCameraVideo:JCMediaDeviceRenderFullContent view:self.view];

JCMediaDeviceRender (opens new window) 决定了视频的渲染模式,保证比例显示、裁剪显示、拉伸填充。

# 创建远端视频画面

通话建立后假如访客有视频流的上传,坐席这边就可以获取到访客的视频流来进行界面的渲染展示。

JCMediaDeviceVideoCanvas *canvas = [_mediaDevice startVideo:_agent.guestParticipant.renderId renderType: JCMediaDeviceRenderFullContent view:self.view]];

# 结束通话

当业务办理结束,访客可以主动结束通话,坐席也可以主动结束通话,其中坐席挂断的方式如下

[_agent term];

主动和被动的挂断事件与来电、接通一样,都通过OnCallStateChanged (opens new window) 接口上报,其中JCAgentTermReason (opens new window) 可以用来判断挂断原因,如:主动挂断、对端挂断等,详细可参考接口文档或者 SDK 注释。

# 销毁本地和远端视频画面

当不再需要查看视频画面,或者通话结束,需要调用接口来释放渲染的资源。

[_mediaDevice stopVideo:_localCanvas];
[_mediaDevice stopVideo:_remoteCanvas];

# 签出

当所有业务处理完毕,坐席可以使用签出接口来从排队机注销,签出后排队机将不会分发访客到这个坐席终端,portal 后台上该坐席的状态将变为离线。

[_agent checkout];

签出的结果通过实现 JCAgentCallback 中的 onCheckoutResult (opens new window) 接口来上报。

- (void)onCheckoutResult:(bool)result resaon:(JCAgentCheckoutReason)reason {
    if (result) {
        // 签出成功
    } else {
        // 签出失败
    }
}