# 实现视频客服

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

# 发起呼叫

在登录成功之后,访客就可以通过发起呼叫的接口来呼叫自己要做的业务。

_guest.Call("10086", new JCGuestCallParam());

其中 JCGuestCallParam (opens new window) 包含了很多呼叫的扩展参数,比如随路参数、视频分辨率信息等,这个将在进阶功能集成里做介绍。

# 通话状态改变通知

当访客接听通话,或者通话结束,都会通过 JCGuestCallback (opens new window) 里的事件进行上报。

示例代码如下:

public void OnCallStateChanged(JCGuestCallStateChangeType type, JCGuestCallTermReason reason)
{
    switch (type)
    {
        case JCGuestCallStateChangeType.Calling:
            // 呼叫中
            break;
        case JCGuestCallStateChangeType.Waiting:
            // 等待坐席接听
            break;
        case JCGuestCallStateChangeType.Talking:
            // 已接通
            break;
        case JCGuestCallStateChangeType.Termed:
            // 通话结束
            break;
    }
}

# 创建本地视频画面

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

JCMediaDeviceVideoCanvas localCanvas = _mediaDevice.StartCameraVideo(_mediaDevice.CameraDevices[0], JCMediaDeviceRenderMode.FullScreen);
this.localView.Background = new ImageBrush(localCanvas.VideoView)
{
        Stretch = Stretch.UniformToFill
};

Stretch 决定了视频的渲染模式,保证比例显示、裁剪显示、拉伸填充,该参数为 Windows API 的自带参数,不赘述。

# 创建远端视频画面

当通话建立后,如果坐席有视频流的上传,访客端可以获取到坐席的视频流并进行渲染。

JCMediaDeviceVideoCanvas remoteCanvas = _mediaDevice.StartVideo(_guest.AgentParticipant?.RenderId, JCMediaDeviceRenderMode.FullScreen);
this.remoteView.Background = new ImageBrush(remoteCanvas.VideoView)
{
    Stretch = Stretch.UniformToFill
};

渲染访客画面的用法与渲染摄像头画面的用法基本一致,需关注 Stretch 的渲染模式。

# 挂断

访客可以在呼叫等待或者通话中主动取消或者结束通话。

_guest.Term();

主动和被动的挂断事件与来电、接通一样,都通过 OnCallStateChanged (opens new window) 接口上报。

其中 JCGuestTermReason 可以用来判断挂断原因,如:主动挂断、对端挂断等,详细可参考接口文档或者 SDK 注释。

# 销毁视频画面渲染

当不再需要查看视频画面,或者通话结束,需要 MediaDevice (opens new window) 对象的 StopVideo (opens new window) 方法来释放渲染资源。

该方法需传入要释放的 JCMediaDeviceVideoCanvas (opens new window) 对象。

void OnCallStateChanged(JCGuestCallStateChangeType type,JCGuestCallTermReason reason)
{
    if(type==JCGuestCallStateChangeType.Termed)//来电状态变为挂断
    {
      	mediaDevice.StopVideo(localCanvas);//停止本地访客的画面渲染
		mediaDevice.StopVideo(remoteCanvas);//停止远端坐席的画面渲染
    }
}