智慧服务,成就美好体验 项目咨询

主页 > 服务与支持 > 开发平台 > 客户端SDK参考 > Windows Native SDK > 会议 会议接入

入门使用

会议接入

更新时间:2019-11-20

会议列表一键入会

描述

用户通过会议列表一键入会的方式加入会议。

前提条件:

  1. 鉴权登录成功。
  2. SIP号码已成功注册。
  3. 会议环境参数已设置。

业务流程

图1 会议列表一键入会流程 
  1. UI调用tsdk_join_conference()加入会议;SDK发送加入会议请求至服务器。
    说明: 

    在加入会议时,入会参数(conf_join_param),是否视频接入会议(is_video_join)为必选;

    1. 入会参数机构体重conf_id,access_number,conf_password都为必选。
    2. 入会号码(join_number)如果不填,则使用自己软终端号码入会。
    3. 会议对应的呼叫ID(接口会同步返回call_id,需要记录下),在使用SIP终端号码入会时有效。
    代码示例:
    //c code
    TSDK_RESULT ret;
    ret = tsdk_join_conference(confJoinParam, joinNumber, isVideoJoin, callId);
    if (TSDK_SUCCESS != ret)
    {
        LOG_D_CALL_ERROR("join conf failed. result=%#x", ret);
        return -1;
    }
    return TSDK_SUCCESS;
    
     
  2. SDK在收到服务器返回的加入会议响应后,向UI上报加入会议结果通知TSDK_E_CONF_EVT_JOIN_CONF_RESULT,对应的结果数据结构为TSDK_S_JOIN_CONF_IND_INFO,并返回conf handle,后续会控时使用,此时, UI可跳转至会议界面。
    说明: 
    1. 在加入会议时,会请求会议权限,若请求失败,则会向UI上报会议权限请求失败通知TSDK_E_CONF_EVT_REQUEST_CONF_RIGHT_FAILED,UI提示申请会控权限失败,若请求成功,则不上报。
    2. 若应用程序是以多流的方式(SVC)成功加入会议,则此结果通知中会携带SVC信息,包含 is_svc_conf (是否多流会议)、svc_label_count(可使用的多流Label数) 和 svc_label (多流Label 表),应用程序应保存多流“Label”信息,用于后继流程中“绑定SVC视频窗口”、"选看SVC与会者"和“设置SVC窗口和与会者关系”等操作。
    代码示例:
    //c code
    case TSDK_E_CONF_EVT_JOIN_CONF_RESULT:
    {
         if (TSDK_SUCCESS == param2)
         {
             CHECK_POINTER(data);
             TSDK_S_JOIN_CONF_IND_INFO* pResult = (TSDK_S_JOIN_CONF_IND_INFO*)data;
             TSDK_S_JOIN_CONF_IND_INFO* notifyInfo = new TSDK_S_JOIN_CONF_IND_INFO;
             memset(notifyInfo, 0, sizeof(TSDK_S_JOIN_CONF_IND_INFO));
             memcpy_s(notifyInfo, sizeof(TSDK_S_JOIN_CONF_IND_INFO), pResult, sizeof(TSDK_S_JOIN_CONF_IND_INFO));
             ::PostMessage(maindlg->GetSafeHwnd(), WM_CONF_CTRL_JOIN_RESULT, (WPARAM)notifyInfo, (LPARAM)param1);
         }
         else 
         {
              maindlg->MessageBox(_T("join conf failed!"));
         }
         break;
    }
    
     
  3. SDK收到会议状态更新通知,向UI上报会议信息及状态更新事件TSDK_E_CONF_EVT_INFO_AND_STATUS_UPDATE,UI刷新会议成员列表和会议信息。

    代码示例详见“更新会议状态信息和与会者列表”描述。

  4. 若会议包含数据会议能力,SDK会向UI上报获取数据会议参数结果TSDK_E_CONF_EVT_GET_DATACONF_PARAM_RESULT。
    代码示例:
    //c code
    case TSDK_E_CONF_EVT_GET_DATACONF_PARAM_RESULT:
    {
         if (TSDK_SUCCESS != param2)
         {
             maindlg->MessageBox(_T("get data conf param failed!"));
         }
         else
         {
             ::PostMessage(maindlg->GetSafeHwnd(), WM_CONF_CTRL_GET_DATA_CONF_PARAM, (WPARAM)param1, NULL);
         }
         break;
    }
    
     
  5. 此时UI可选择自动加入或用户选择加入数据会议,调用加入数据会议接口tsdk_join_data_conference(),SDK发送创建会议请求至会议服务器。
    代码示例:
    //c code
    TSDK_RESULT ret;
    ret = tsdk_join_data_conference(confHandle);
    if (TSDK_SUCCESS != ret)
    {
        LOG_D_CALL_ERROR("join data conf failed. result=%#x", ret);
        return -1;
    }
    return TSDK_SUCCESS;
    
     
  6. SDK在收服务器加入数据会议响应后,向UI上报数据会议加入结果通知TSDK_E_CONF_EVT_JOIN_DATA_CONF_RESULT,若成功,则UI刷新界面,提示加入数据会议成功,若失败,则提示加入数据会议失败。
    说明: 

    在加入数据会议后,会向UI上报会议信息及状态更新事件TSDK_E_CONF_EVT_INFO_AND_STATUS_UPDATE,UI刷新会议成员列表和会议信息。

    代码示例:
    //c code
    case TSDK_E_CONF_EVT_JOIN_DATA_CONF_RESULT:
    {
         ::PostMessage(maindlg->GetSafeHwnd(), WM_CONF_CTRL_JOIN_DATACONF_RESULT, NULL, (LPARAM)param2);
         break;
    }   
    
     

注意事项

无。

会议接入码入会

描述

用户由第三方途径获取会议信息,通过输入会议号和接入码的方式加入会议。

说明: 
  1. 因不支持从拨号盘拨打“会议号”+“接入码”的方式直接加入会议,所以应用程序界面需要提供“接入会议”的单独入口;
  2. 与“会议列表一键入会”的接口调用流程相同,不同在于用户界面入口。

业务流程

参见“会议列表一键入会”。

注意事项

无。

统一会议接入号入会

描述

用户由第三方途径获取会议信息,通过拨打统一会议接入号,使用IVR导航的方式加入会议。

前提条件:

  1. 鉴权登录成功;
  2. SIP号码已成功注册;
  3. 会议环境参数已设置。

业务流程

图2 统一会议接入号入会流程

  1. UI调用“音视频呼叫”接口tsdk_start_call()发起一个呼叫请求,被叫号码为“统一会议接入号”。
    代码示例:
    //c code
    TSDK_RESULT ret;
    ret = tsdk_start_call(&callid, call_number, FALSE);
    if (TSDK_SUCCESS != ret)
    {
        LOG_D_CALL_ERROR("start call failed. result=%#x", ret);
        return -1;
    }
    return TSDK_SUCCESS;
    
     
  2. 若呼叫建立 成功,SDK向UI上报呼叫建立事件TSDK_E_CALL_EVT_CALL_CONNECTED,与普通音视频呼叫相同。
    代码示例:
    //c code
    case TSDK_E_CALL_EVT_CALL_CONNECTED:
    {
         CHECK_POINTER(data);
         TSDK_S_CALL_INFO* callInfo = (TSDK_S_CALL_INFO*)data;
         TSDK_S_CALL_INFO* notifyInfo = new TSDK_S_CALL_INFO;
         memset(notifyInfo, 0, sizeof(TSDK_S_CALL_INFO));
         memcpy_s(notifyInfo, sizeof(TSDK_S_CALL_INFO), callInfo, sizeof(TSDK_S_CALL_INFO));
    
         ::PostMessage(maindlg->GetSafeHwnd(), WM_CALL_CONNECTED, (WPARAM)notifyInfo, NULL);
         break;
    }
    
     
  3. 用户根据服务器的语言提示,在二次拨号界面输入会议接入码和密码,UI调用tsdk_send_dtmf()完成会议接入码和密码发送,SDK完成入会交互处理。
    代码示例:
    //c code
    TSDK_RESULT ret;
    ret = tsdk_send_dtmf(callid, tone);
    if (TSDK_SUCCESS != ret)
    {
        LOG_D_CALL_ERROR("send dtmf failed. result=%#x", ret);
        return -1;
    }
    return TSDK_SUCCESS;
    
     
  4. SDK在收到服务器返回的加入会议响应后,向UI上报加入会议结果通知TSDK_E_CONF_EVT_JOIN_CONF_RESULT,对应的结果数据结构为TSDK_S_JOIN_CONF_IND_INFO,并返回conf handle,后续会控时使用,此时, UI可跳转至会议界面。
    说明: 
    1. 在加入会议时,会请求会议权限,若请求失败,则会向UI上报会议权限请求失败通知TSDK_E_CONF_EVT_REQUEST_CONF_RIGHT_FAILED,UI提示申请会控权限失败,若请求成功,则不上报。
    2. 若应用程序是以多流的方式(SVC)成功加入会议,则此结果通知中会携带SVC信息,包含 is_svc_conf (是否多流会议)、svc_label_count(可使用的多流Label数) 和 svc_label (多流Label 表),应用程序应保存多流“Label”信息,用于后继流程中“绑定SVC视频窗口”、"选看SVC与会者"和“设置SVC窗口和与会者关系”等操作。
    代码示例:
    //c code
    case TSDK_E_CONF_EVT_JOIN_CONF_RESULT:
    {
         if (TSDK_SUCCESS == param2)
         {
             CHECK_POINTER(data);
             TSDK_S_JOIN_CONF_IND_INFO* pResult = (TSDK_S_JOIN_CONF_IND_INFO*)data;
             TSDK_S_JOIN_CONF_IND_INFO* notifyInfo = new TSDK_S_JOIN_CONF_IND_INFO;
             memset(notifyInfo, 0, sizeof(TSDK_S_JOIN_CONF_IND_INFO));
             memcpy_s(notifyInfo, sizeof(TSDK_S_JOIN_CONF_IND_INFO), pResult, sizeof(TSDK_S_JOIN_CONF_IND_INFO));
             ::PostMessage(maindlg->GetSafeHwnd(), WM_CONF_CTRL_JOIN_RESULT, (WPARAM)notifyInfo, (LPARAM)param1);
         }
         else 
         {
              maindlg->MessageBox(_T("join conf failed!"));
         }
         break;
    }
    
     
  5. SDK收到会议状态更新通知,向UI上报会议信息及状态更新事件TSDK_E_CONF_EVT_INFO_AND_STATUS_UPDATE,UI刷新会议成员列表和会议信息。

    代码示例详见“更新会议状态信息和与会者列表”描述。

  6. 若会议包含数据会议能力,SDK会向UI上报获取数据会议参数结果TSDK_E_CONF_EVT_GET_DATACONF_PARAM_RESULT。
    代码示例:
    //c code
    case TSDK_E_CONF_EVT_GET_DATACONF_PARAM_RESULT:
    {
         if (TSDK_SUCCESS != param2)
         {
             maindlg->MessageBox(_T("get data conf param failed!"));
         }
         else
         {
             ::PostMessage(maindlg->GetSafeHwnd(), WM_CONF_CTRL_GET_DATA_CONF_PARAM, (WPARAM)param1, NULL);
         }
         break;
    }
    
     
  7. 此时UI可选择自动加入或用户选择加入数据会议,调用加入数据会议接口tsdk_join_data_conference(),SDK发送创建会议请求至会议服务器。
    代码示例:
    //c code
    TSDK_RESULT ret;
    ret = tsdk_join_data_conference(confHandle);
    if (TSDK_SUCCESS != ret)
    {
        LOG_D_CALL_ERROR("join data conf failed. result=%#x", ret);
        return -1;
    }
    return TSDK_SUCCESS;
    
     
  8. SDK在收服务器加入数据会议响应后,向UI上报数据会议加入结果通知TSDK_E_CONF_EVT_JOIN_DATA_CONF_RESULT,若成功,则UI刷新界面,提示加入数据会议成功,若失败,则提示加入数据会议失败。
    说明: 

    在加入数据会议后,会向UI上报会议信息及状态更新事件TSDK_E_CONF_EVT_INFO_AND_STATUS_UPDATE,UI刷新会议成员列表和会议信息。

    代码示例:
    //c code
    case TSDK_E_CONF_EVT_JOIN_DATA_CONF_RESULT:
    {
         ::PostMessage(maindlg->GetSafeHwnd(), WM_CONF_CTRL_JOIN_DATACONF_RESULT, NULL, (LPARAM)param2);
         break;
    }   
    
     

注意事项

无。

被邀接入会议

描述

会议主席邀请新的与会者加入会议。

与会者通过主席身份加入会议,或已申请获取为主席。

业务流程

图3 被邀入会流程 
  1. 被邀与会者侧SDK收到会议来电请求,向UI上报会议来电事件TSDK_E_CONF_EVT_CONF_INCOMING_IND,对应的事件数据结构为TSDK_S_CONF_INCOMING_INFO,UI提示用户会议来电。
    代码示例:
    //c code
    case TSDK_E_CONF_EVT_CONF_INCOMING_IND:
    {
         CHECK_POINTER(data);
         TSDK_S_CONF_INCOMING_INFO* pResult = (TSDK_S_CONF_INCOMING_INFO*)data;
         TSDK_S_CONF_INCOMING_INFO* notifyInfo = new TSDK_S_CONF_INCOMING_INFO;
         memset(notifyInfo, 0, sizeof(TSDK_S_CONF_INCOMING_INFO));
         memcpy_s(notifyInfo, sizeof(TSDK_S_CONF_INCOMING_INFO), pResult, sizeof(TSDK_S_CONF_INCOMING_INFO));
         ::PostMessage(maindlg->GetSafeHwnd(), WM_CONF_CTRL_CONF_COMMING, (WPARAM)notifyInfo, (LPARAM)param1);
         break;
    }
    
    LRESULT CDemoMainDlg::OnConfInComming(WPARAM wparam, LPARAM lparam)
    {
        TSDK_S_CONF_INCOMING_INFO* notifyInfo = (TSDK_S_CONF_INCOMING_INFO*)wparam;
        CHECK_POINTER_RETURN(notifyInfo, 0L);
        unsigned int handle = (unsigned int)lparam;
        std::string strchairman = notifyInfo->number;
        unsigned int conf_id = CTools::str2num(notifyInfo->conf_id);
        SetConfChairman(false);
    
        CDemoCallInCommingDlg incommingDlg;
    
        if (TSDK_E_CONF_MEDIA_VIDEO == notifyInfo->conf_media_type || TSDK_E_CONF_MEDIA_VIDEO_DATA == notifyInfo->conf_media_type)
        {
            incommingDlg.GetInitParam(VIDEO_CONF_CALL, strchairman, conf_id);
        }
        else
        {
            incommingDlg.GetInitParam(AUDIO_CONF_CALL, strchairman, conf_id);
        }
    
        INT_PTR nResponse = incommingDlg.DoModal();
        if (IDOK == nResponse)
        {
            if (TSDK_E_CONF_MEDIA_VIDEO == notifyInfo->conf_media_type || TSDK_E_CONF_MEDIA_VIDEO_DATA == notifyInfo->conf_media_type)
            {
                (void)service_conf_mem_accept(handle, TRUE);
            }
            else
            {
                (void)service_conf_mem_accept(handle, FALSE);
            }
        }
        else
        {
            (void)service_conf_mem_reject(handle);
        }
        m_confHandle = handle;
        SAFE_DELETE(notifyInfo);
        return 0L;
    }
    
     
  2. 被邀与会者侧接受入会邀请则调用tsdk_accept_conference()接听会议来电呼叫,拒绝入会邀请则调用tsdk_reject_conference()。
    代码示例:
    //c code
    TSDK_RESULT ret;
    ret = tsdk_accept_conference(confHandle, isJoinVideo);
    if (TSDK_SUCCESS != ret)
    {
        LOG_D_CALL_ERROR("accept conf failed. result=%#x", ret);
        return -1;
    }
    return TSDK_SUCCESS;
    
     
  3. SDK在收到服务器返回的加入会议响应后,向UI上报加入会议结果通知TSDK_E_CONF_EVT_JOIN_CONF_RESULT,对应的结果数据结构为TSDK_S_JOIN_CONF_IND_INFO,并返回conf handle,后续会控时使用,此时, UI可跳转至会议界面。
    代码示例:
    //c code
    case TSDK_E_CONF_EVT_JOIN_CONF_RESULT:
    {
         if (TSDK_SUCCESS == param2)
         {
             CHECK_POINTER(data);
             TSDK_S_JOIN_CONF_IND_INFO* pResult = (TSDK_S_JOIN_CONF_IND_INFO*)data;
             TSDK_S_JOIN_CONF_IND_INFO* notifyInfo = new TSDK_S_JOIN_CONF_IND_INFO;
             memset(notifyInfo, 0, sizeof(TSDK_S_JOIN_CONF_IND_INFO));
             memcpy_s(notifyInfo, sizeof(TSDK_S_JOIN_CONF_IND_INFO), pResult, sizeof(TSDK_S_JOIN_CONF_IND_INFO));
             ::PostMessage(maindlg->GetSafeHwnd(), WM_CONF_CTRL_JOIN_RESULT, (WPARAM)notifyInfo, (LPARAM)param1);
          }
          else 
          {
              maindlg->MessageBox(_T("join conf failed!"));
          }
          break;
    }
    
     
  4. SDK收到会议成员列表刷新通知,向UI上报会议成员列表刷新事件TSDK_E_CONF_EVT_INFO_AND_STATUS_UPDATE,UI刷新会议成员列表和会议信息。

    代码示例详见“更新会议状态信息和与会者列表”描述。

匿名加入会议

描述

用户在未注册EC帐号时,通过匿名方式加入一个会议。

会议已经创建,且用户通过第三方方式获取到会议ID和密码。

业务流程

图4 匿名加入会议流程 
  1. UI调用tsdk_join_anonymous_conference()接口,匿名加入会议。
    说明: 

    参数TSDK_S_CONF_ANONYMOUS_JOIN_PARAM中的服务器地址和端口,指会议服务器的地址和端口。

    代码示例:

    //c code
    TSDK_S_CONF_ANONYMOUS_JOIN_PARAM anonymousJoinConfParam;
    service_memset_s(&anonymousJoinConfParam,sizeof(TSDK_S_CONF_ANONYMOUS_JOIN_PARAM),0,sizeof(TSDK_S_CONF_ANONYMOUS_JOIN_PARAM));
    
    anonymousJoinConfParam.user_id = 1;
    CTools::CString2Char(m_strConfId, anonymousJoinConfParam.conf_id, TSDK_D_MAX_CONF_ID_LEN);
    CTools::CString2Char(m_strJoinPwd, anonymousJoinConfParam.conf_password, TSDK_D_MAX_CONF_PASSWORD_LEN);
    CTools::CString2Char(m_strConfServerAddress, anonymousJoinConfParam.server_addr, TSDK_D_MAX_URL_LENGTH);
    CTools::CString2Char(m_strNickname, anonymousJoinConfParam.display_name, TSDK_D_MAX_DISPLAY_NAME_LEN);
    anonymousJoinConfParam.server_port = (unsigned short)CTools::str2num(CTools::UNICODE2UTF(m_strConfServerPort));
    
    (void)service_join_conference_by_anonymous(&anonymousJoinConfParam);
    
    int service_join_conference_by_anonymous(TSDK_S_CONF_ANONYMOUS_JOIN_PARAM *confJoinParam)
    {
        TSDK_RESULT ret;
        ret = tsdk_join_conference_by_anonymous(confJoinParam);
        if (TSDK_SUCCESS != ret)
        {
            LOG_D_CALL_ERROR("join conference by anonymous failed. result=%#x", ret);
            return -1;
        }
        return TSDK_SUCCESS;
    }
    
     
  2. SDK通过会议ID和密码向会议服务器完成鉴权,获取临时帐号,上报临时帐号获取结果事件TSDK_E_LOGIN_EVT_GET_TEMP_USER_RESULT。
    说明: 

    若此次事件通知返回失败,应用程序界面应提示用户。

    代码示例:

    //c code
    case TSDK_E_LOGIN_EVT_GET_TEMP_USER_RESULT:
    {
         CHECK_POINTER(data);
         TSDK_CHAR* notifyInfo = (TSDK_CHAR*)data;
         ::PostMessage(logindlg->GetSafeHwnd(), WM_LOGIN_GET_TEMP_USER_RESULT, (WPARAM)notifyInfo, NULL);
         break;
    }
    
     
  3. SDK自动完成临时帐号注册,并完成加入会议处理,向UI上报加入会议结果事件TSDK_E_CONF_EVT_JOIN_CONF_RESULT。后续过程与普通入会流程相同。
    说明: 

    匿名会议过程中,无论用户采用主席密码入会或是普通与会者密码入会,均只有设置自己闭音的会控能力,其他会控能力暂不支持。

    代码示例:
    //c code
    case TSDK_E_CONF_EVT_JOIN_CONF_RESULT:
    {
    if (TSDK_SUCCESS == param2)
    {
        CHECK_POINTER(data);
        TSDK_S_JOIN_CONF_IND_INFO* pResult = (TSDK_S_JOIN_CONF_IND_INFO*)data;
        TSDK_S_JOIN_CONF_IND_INFO* notifyInfo = new TSDK_S_JOIN_CONF_IND_INFO;
        service_memset_s(notifyInfo, sizeof(TSDK_S_JOIN_CONF_IND_INFO), 0, sizeof(TSDK_S_JOIN_CONF_IND_INFO));
        memcpy_s(notifyInfo, sizeof(TSDK_S_JOIN_CONF_IND_INFO), pResult, sizeof(TSDK_S_JOIN_CONF_IND_INFO));
        ::PostMessage(maindlg->GetSafeHwnd(), WM_CONF_CTRL_JOIN_RESULT, (WPARAM)notifyInfo, (LPARAM)param1);
    }
    else
    {
         maindlg->MessageBox(_T("join conf failed!"));
    }
    break;
    }