tencent cloud

文档反馈

最后更新时间:2023-09-14 15:10:30
    本文将介绍如何用最短的时间完成 TUICallKit 组件的接入,您将在一小时内完成如下几个关键步骤,并最终得到一个包含完备 UI 界面的视频通话功能。
    视频通话
    语音通话
    
    
    
    
    
    

    环境准备

    1. @vue/cli。
    2. @tencentcloud/call-uikit-vue2 如果使用源码集成需要:Vue2.7 + Typescript;如果使用 npm 包集成 Vue2 各版本都可以。
    3. @tencentcloud/call-uikit-vue 如果使用源码集成需要:Vue3 + Typescript。

    步骤一:开通服务

    TUICallKit 是基于腾讯云 即时通信 IM实时音视频 TRTC 两项付费 PaaS 服务构建出的音视频通信组件。为了您能更好地体验音视频通话 Call 功能,我们免费为每个 SDKAppID 提供了 7 天体验版(体验版不额外赠送通话时长),您可以在 实时音视频 TRTC 控制台中开通 Call 体验版,具体操作步骤如下:
    1. 访问 TRTC 控制台 > Call,选择创建应用
    
    
    
    2. 在创建弹窗中,产品选择 Call 并输入应用名称,您也可以选择关联已有应用,为已存在的 TRTC 应用开通 Call。选择完成后点击 创建应用
    
    
    
    3. 完成应用创建后将默认进入应用详情页,在浮窗中选择体验版,并点击立即领取
    
    
    
    4. 确认弹窗内容后,单击立即体验,即可成功开通音视频通话体验版。
    
    
    
    5. 开通完成后可在当前页面查看版本信息,并可参见 集成指引 进行集成。
    
    
    

    步骤二:基础使用

    1. 创建项目。
    Vue3 + TypeScript
    使用 @vue/cli 方式创建项目。
    npm install -g @vue/cli
    通过 @vue/cli 创建项目,并选择下图中所选配置项。
    vue create call-demo
    
    
    
    创建项目完成后,切换到项目所在目录。
    cd call-demo
    2. 安装组件。
    Vue3
    ≥Vue2.7
    npm install @tencentcloud/call-uikit-vue
    npm install @tencentcloud/call-uikit-vue2
    3. 请修改下面示例代码中的必要信息,确保正常运行。
    SDKAppID:在腾讯云创建的音视频应用 SDKAppID,参考 开通服务
    userID:用户 ID,由您指定,字符串类型,只允许包含英文字母(a-z 和 A-Z)、数字(0-9)、连词符(-)和下划线(_)。
    userSig:使用 步骤一 的第 2 步中获取的 SecretKey 对 SDKAppID、UserID 等信息进行加密,就可以得到 UserSig,它是一个鉴权用的票据,用于腾讯云识别当前用户是否能够使用 TRTC 的服务。您可以通过控制台中的 UserSig generation 生成一个临时可用的 UserSig。
    4. 参考以下示例代码。
    示例代码1(Vue3 + TypeScript + Composition API)
    示例代码2(Vue2 + JavaScript + Options API)
    <template>
    <div>
    <button @click="init()"> init </button>
    <button @click="call()"> start video call </button>
    <details>
    <summary>auto accept feature</summary>
    <button @click="accept()"> accept </button>
    <button @click="reject()"> reject </button>
    <button @click="hangup()"> hangup </button>
    </details>
    <div style="width: 50rem; height: 35rem; border: 1px solid salmon;">
    <TUICallKit
    :beforeCalling="beforeCalling"
    :afterCalling="afterCalling"
    :onMinimized="onMinimized"
    :allowedMinimized="true"
    :allowedFullScreen="true"
    :videoDisplayMode="VideoDisplayMode.CONTAIN"
    :videoResolution="VideoResolution.RESOLUTION_1080P" />
    </div>
    </div>
    </template>
    
    <script lang="ts" setup>
    import { TUICallKit, TUICallKitServer, TUICallType, VideoDisplayMode, VideoResolution } from "@tencentcloud/call-uikit-vue";
    import TIM from "@tencentcloud/chat"
    
    // The following 5 variables need to be modified before running
    const SDKAppID = 0;
    const userID = "";
    const userSig = "";
    const callUserID = ""; // callUserID of the called party in the one-to-one call
    
    // If you do not want to experience group calls, you do not need to set this parameter
    let userIDList = ["xxx", "xxx"]; // UserID of a group call member
    
    async function init() {
    try {
    await TUICallKitServer.init({ SDKAppID, userID, userSig });
    // await TUICallKitServer.init({ tim, SDKAppID, userID, userSig});
    alert("init finished");
    } catch (error: any) {
    alert(`init failed, reason:${error}`);
    }
    }
    
    async function call() {
    try {
    await TUICallKitServer.call({ userID: callUserID, type: TUICallType.VIDEO_CALL }); // one-to-one call
    // If you want to experience a group call, comment the call, and then uncomment the following two pieces of code.
    // const groupID = await createGroupID();
    // TUICallKitServer.groupCall({ userIDList, groupID, type: 2 }); // group call
    } catch (error: any) {
    alert(`call failed, reason:${error}`);
    }
    }
    
    // chat SDK document: https://web.sdk.qcloud.com/im/doc/en/SDK.html#createGroup
    async function createGroupID() {
    let tim = TIM.create({ SDKAppID });
    let memberList: any[] = [];
    userIDList.forEach((user: string) => {
    memberList.push({ userID: user });
    });
    let res = await tim.createGroup({
    type: TIM.TYPES.GRP_PUBLIC,
    name: 'WebSDK',
    memberList
    });
    return res.data.group.groupID;
    }
    
    function beforeCalling(type: string, error: any) {
    console.log("[Callkit Demo] beforeCalling:", type, error);
    }
    
    function afterCalling() {
    console.log("[Callkit Demo] afterCalling");
    }
    
    function onMinimized(oldStatus: string, newStatus: string) {
    console.log("[Callkit Demo] onMinimized: " + oldStatus + " -> " + newStatus);
    }
    
    async function accept() {
    try {
    await TUICallKitServer.accept();
    alert("auto-accept");
    } catch (error) {
    alert(`auto-accept failed, reason:${error}`);
    }
    }
    
    async function reject() {
    try {
    await TUICallKitServer.reject();
    alert("auto-reject");
    } catch (error) {
    alert(`auto-reject failed, reason:${error}`);
    }
    }
    
    async function hangup() {
    try {
    await TUICallKitServer.hangup();
    alert("auto-hangup");
    } catch (error) {
    alert(`auto-hangup failed, reason:${error}`);
    }
    }
    </script>
    <template>
    <div>
    <button @click="init()"> 步骤 1: 初始化 </button>
    <button @click="call()"> 步骤 2: 发起视频通话 </button>
    <div style="width: 50rem; height: 35rem; border: 1px solid salmon;">
    <TUICallKit /> <!-- 组件默认显示空内容,进入通话后自动显示 -->
    </div>
    </div>
    </template>
    
    <script>
    import { TUICallKit, TUICallKitServer, TUICallType } from "@tencentcloud/call-uikit-vue2";
    
    export default {
    name: 'App',
    data() {
    return {
    SDKAppID: 0,
    userID: '',
    userSig: '',
    callUserID: '',
    };
    },
    components: {
    TUICallKit
    },
    methods: {
    async init() {
    try {
    await TUICallKitServer.init({
    SDKAppID: this.SDKAppID,
    userID: this.userID,
    userSig: this.userSig
    // tim: this.tim // 如果工程中已有 tim 实例,需在此处传入
    });
    alert("初始化完成");
    } catch (error) {
    alert(`初始化失败,原因:${error}`);
    }
    },
    async call() {
    try {
    // 1v1 通话
    await TUICallKitServer.call({
    userID: this.callUserID,
    type: TUICallType.VIDEO_CALL
    });
    // 群组通话
    // TUICallKitServer.groupCall({ userIDList: ["xxx"], groupID: "xxx", type: TUICallType.VIDEO_CALL });
    } catch (error) {
    alert(`拨打失败,原因:${error}`);
    }
    }
    },
    }
    </script>
    详细接口使用请参考 TUICallKit 接口文档

    步骤三:拨打通话

    1对1视频通话

    通过调用 TUICallKit 的 call 函数并指定通话类型和被叫方的 userID,就可以发起语音或者视频通话。
    import { TUICallKitServer, TUICallType } from "@tencentcloud/call-uikit-vue";
    await TUICallServer.call({
    userID: 'mike',
    type: TUICallType.VIDEO_CALL
    });
    参数
    类型
    含义
    userID
    String
    目标用户的 userID:"mike"
    type
    Number
    通话的媒体类型,语音通话(type = 1)、视频通话(type = 2)

    群内视频通话

    通过调用 TUICallKit 的 groupCall 函数并指定通话类型和被叫方的 userID 列表,就可以发起群内的语音或者视频通话。
    import { TUICallKitServer, TUICallType } from "@tencentcloud/call-uikit-vue";
    await TUICallServer.groupCall({
    groupID: "xxx",
    userIDList: ['jack', 'tom'],
    type: TUICallType.VIDEO_CALL
    });
    参数
    类型
    含义
    groupID
    String
    群组 Id,示例:"12345678"
    userIDList
    Array<string>
    目标用户的 UserID 列表,示例:["jane", "mike", "tommy"]
    type
    Number
    通话的媒体类型,语音通话(type = 1)、视频通话(type = 2)

    步骤四:更多特性

    1. Floating window

    通过 allowedMinimized 属性可以控制浮窗(最小化)的开启。
    通过 allowedFullScreen 属性可以控制通话窗口全屏的开启。
    <TUICallKit
    :allowedMinimized="true"
    :allowedFullScreen="true"
    />

    2. 自定义铃声

    如果您需要自定义来电铃音,可以通过如下接口进行设置:
    Note:
    ≥v3.0.0 支持
    传入的铃声文件必须为 MP3 格式。
    如需恢复默认铃声,filePath 传空即可。
    这里仅限传入本地文件地址,需要确保该文件目录是应用可以访问的。
    铃声的媒体文件必须放在 public 目录下创建。
    try {
    await TUICallKitServer.setCallingBell(filePath?: string)
    } catch (error: any) {
    alert(`Failed to modify the ringtone :${error}`);
    }

    3. 设置用户头像和昵称

    try {
    await TUICallKitServer.setSelfInfo({ nickName: "xxx", avatar: "http://xxx" });
    } catch (error: any) {
    alert(`Failed to setSelfInfo :${error}`);
    }

    4. 通话状态回调与 UI 设置

    本组件提供了通话状态回调,可以用于业务侧实现更多交互逻辑。
    beforeCalling: 通话前会执行
    afterCalling: 通话后执行
    onMinimized: 组件切换最小化后会执行
    kickedOut: 该用户被移出(如重复登录),通话自动结束。(≥v2.3.2 支持
    statusChanged: 通话状态发生了变化,使用方式参照下方示例代码,status 种类参考 API 文档。(≥v2.3.2 支持
    本组件提供了若干个功能开关,可以根据需要选择开启或关闭。
    allowedMinimized: 是否允许最小化
    allowedFullScreen: 是否允许全屏
    videoDisplayMode: 画面显示模式
    videoResolution: 通话分辨率
    本组件提供了若干个事件,会在组件内触发通知到业务侧。
    注意:
    低于 v2.3.2 支持的特性;
    ≥v2.3.2 不再支持事件,而是采用回调的方式。
    kicked-out: 该用户被移出(如重复登录),通话自动结束
    status-changed: 通话状态发生了变化,使用方式参照下方示例代码,status 种类参考 API 文档
    <script lang="ts" setup>
    import { TUICallKit, TUICallKitServer, TUICallType, VideoDisplayMode, VideoResolution } from "@tencentcloud/call-uikit-vue";
    
    // The following 4 variables need to be modified before running.
    const SDKAppID = 0;
    const userID = "";
    const userSig = "";
    const callUserID = "";
    
    async function init() {
    try {
    await TUICallKitServer.init({ SDKAppID, userID, userSig });
    // await TUICallKitServer.init({ tim, SDKAppID, userID, userSig}); // If there is already a TIM instance in the project, it needs to be passed here.
    alert("Initialization completed.");
    } catch (error: any) {
    alert(`Initialization failed. Reason: ${error}`);
    }
    }
    async function call() {
    try {
    await TUICallKitServer.call({ userID: callUserID, type: TUICallType.VIDEO_CALL }); // 1v1 call
    // TUICallKitServer.groupCall({ userIDList: ["xxx"], groupID: "xxx", type: 2 }); // Group call
    } catch (error: any) {
    alert(Call failed. Reason: ${error});
    }
    }
    function beforeCalling(type: string, error: any) {
    console.log("[Callkit Demo] beforeCalling:", type, error);
    }
    function afterCalling() {
    console.log("[Callkit Demo] afterCalling");
    }
    function onMinimized(oldStatus: string, newStatus: string) {
    console.log("[Callkit Demo] onMinimized: " + oldStatus + " -> " + newStatus);
    }
    function handleKickedOut() {
    console.log("[Callkit Demo] handleKickedOut");
    }
    function handleStatusChanged(args: { oldStatus: string; newStatus: string; }) {
    const { oldStatus, newStatus } = args;
    if (newStatus === STATUS.CALLING_C2C_VIDEO) {
    console.log(`[Callkit Demo] handleStatusChanged: ${oldStatus} -> ${newStatus}`);
    }
    }
    </script>
    <template>
    <div>
    <button @click="init()"> init </button>
    <button @click="call()"> video call </button>
    <div style="width: 50rem; height: 35rem; border: 1px solid salmon;">
    <TUICallKit
    :beforeCalling="beforeCalling"
    :afterCalling="afterCalling"
    :onMinimized="onMinimized"
    :allowedMinimized="true"
    :allowedFullScreen="true"
    :videoDisplayMode="VideoDisplayMode.CONTAIN"
    :videoResolution="VideoResolution.RESOLUTION_1080P"
    :kickedOut="handleKickedOut"
    :statusChanged="handleStatusChanged"
    />
    </div>
    </div>
    </template>

    5. 通过接口设置自动接听

    通过 TUICallKitServer 组件的接口,可以灵活的控制 <TUICallKit/> 组件的状态,实现业务侧的更多需求。
    注意:在调用“接听/拒绝/挂断”等接口时,为了维护良好的用户体验,建议在 UI 层面上提醒用户该通话已被自动处理。
    accept() : 接听来电
    reject() : 拒绝来电
    hangup() : 挂断已接通的电话
    // 此接口需确保在收到来电邀请后调用(status === STATUS.BE_INVITED),通话状态可以参考 `@status-changed` 的抛出。
    try {
    await TUICallKitServer.accept();
    alert(`已自动接听`);
    } catch (error: any) {
    alert(`自动接听失败,原因:${error}`);
    }
    // 与 accept() 相同,具有一样的调用时机限制。
    try {
    await TUICallKitServer.reject();
    alert(`已自动拒绝`);
    } catch (error: any) {
    alert(`自动拒绝失败,原因:${error}`);
    }
    // 调用此接口需确保已经在呼叫状态或接通状态(status !== STATUS.BE_INVITED && status !== STATUS.IDLE)。通话状态可以参考 `@status-changed` 的抛出。
    try {
    await TUICallKitServer.hangup();
    alert(`已自动挂断`);
    } catch (error: any) {
    alert(`自动挂断失败,原因:${error}`);
    }

    常见问题

    1. 错误提示“The package you purchased does not support this ability”?

    如遇以上错误提示,是由于您当前应用的音视频通话能力包过期或未开通,请参见 步骤一:开通服务,领取或者开通音视频通话能力,进而继续使用 TUICallKit 组件。

    2、如何购买套餐?

    请参考购买链接 购买正式版

    3. 体验 Demo

    在接入前,您可以访问在线 Demo 1v1音视频通话体验馆 体验通话效果。
    如果想要跑通一个新工程,还可以直接阅读 Vue3 Demo 快速跑通 或者 Vue2 Demo 快速跑通

    交流与反馈

    如果有任何需要或者反馈,您可以联系:colleenyu@tencent.com。
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持