<返回更多

如何基于 ZEGO SDK 实现 Windows 一对一视频聊天应用

2022-04-21    IT开发智库
加入收藏

互联网发展至今,实时视频和语音通话越来越被大众所依赖。

今天,我们将会继续介绍如何基于ZEGO SDK实现音视频通话功能,前两篇文章分别介绍了Android,Flutter平台的实现方式,感兴趣的小伙伴可点击了解: Android,Flutter。

接下来,我们将会一起开发一个RTC场景的windows应用。

1 准备环境

在开始集成 ZEGO Express SDK 前,请确保开发环境满足以下要求:
Visual Studio 2015 或以上版本。
Windows 7 或以上版本。
麦克风、摄像头等支持音视频功能的外部设备。

2 项目准备

2.1 创建项目

进入即构官网,在【ZEGO控制台】创建项目,并申请有效的 AppID,这一步很关键,appid为应用的唯一标识,如身份证号,是应用的身份证明,用于明确你的项目及组织身份。zego提供的服务也是基于APP ID;

App ID的获取方式很简单,只需3~5分钟,在即构官网-我的项目-创建即可。创建的项目信息可用于SDK的集成和配置;

2.2 Token 鉴权

登录房间时必须 使用 Token 鉴权 ,可参考 Token 鉴权教程
为了方便开发阶段的调试,开发者可直接在 ZEGO 控制台获取临时 Token(有效期为 24 小时) 来使用,详情请参考 控制台(新版) - 项目管理 中的 “项目信息”。

3 集成

3.1 项目设置

1.打开 Microsoft Visual Studio,选择“文件 > 新建 > 项目”菜单。

如何基于 ZEGO SDK 实现 Windows 一对一视频聊天应用

 

2.在新建项目窗口,选择项目类型为“MFC 应用程序”,输入项目名称,选择项目存储路径,并单击“确定”。

如何基于 ZEGO SDK 实现 Windows 一对一视频聊天应用

 

3.进入 MFC 应用程序窗口,选择“应用程序类型”为“基于对话框”,并单击“完成”。

如何基于 ZEGO SDK 实现 Windows 一对一视频聊天应用

 

3.2 导入 SDK

1.下载 SDK。

请从 下载 SDK 包 下载 SDK。

2.解压 SDK,并拷贝到项目目录下。

SDK 包含 “include” 和 “lib” 两个目录,每个目录包含的文件说明如下。

include    --------------- 包含SDK头文件
lib        --------------- 包含SDK的.lib和.dll文件
| x86   --------------- 32位版本
| x64   --------------- 64位版本

4 设置项目属性

在解决方案资源管理器窗口中,右击项目名称,单击“属性”,进入项目属性页。在项目属性页面内进行以下配置,配置完成后单击“确定”。
1.将 “include” 目录加入到文件搜索路径。
选择“配置属性 > C/C++ > 常规”菜单,在“附加包含目录”中添加 “include” 目录。

如何基于 ZEGO SDK 实现 Windows 一对一视频聊天应用

 

2.将 “lib” 目录加入到搜索路径。
选择“配置属性 > 链接器 > 常规”菜单,在“附加目录”中添加 “lib/x86” 或 “lib/x64” 目录。

如何基于 ZEGO SDK 实现 Windows 一对一视频聊天应用

 

3.指定链接库 “ZegoExpressEngine.lib”。
选择“配置属性 > 链接器 > 输入”菜单,在“附加依赖项”中添加 “ZegoExpressEngine.lib”。

如何基于 ZEGO SDK 实现 Windows 一对一视频聊天应用

 

5 实现流程

如以下流程图,用户A与B通过 ZEGO Express SDK 进行视频通话,与用户 A 拉取用户 B 的流为例:

如何基于 ZEGO SDK 实现 Windows 一对一视频聊天应用

 

为保证实时音视频的通话质量,推拉流关键流程需按照API的正确调用时序进行,完整时序如下图:

如何基于 ZEGO SDK 实现 Windows 一对一视频聊天应用

 

5.1 创建引擎

1. 创建界面

根据场景需要,为您的项目创建视频通话的用户界面。我们推荐您在项目中添加如下元素:

如何基于 ZEGO SDK 实现 Windows 一对一视频聊天应用

 

2. 引入头文件

在项目中引入 ZegoExpressEngine 头文件。

// 引入 ZegoExpressEngine.h 头文件
#include "ZegoExpressSDK.h"

3. 创建引擎

调用 createEngine 接口,将申请到的 AppID 传入参数 “appID” 和,创建引擎单例对象。
注册回调,可将实现了 ZegoEventHandler 的对象(例如 “self”)传入参数 “eventHandler”。

ZegoEngineProfile profile;
// AppID 由 ZEGO 分配给各 App
profile.appID = appID;
profile.scenario = ZegoScenario::ZEGO_SCENARIO_GENERAL;
// 创建引擎实例
auto engine = ZegoExpressSDK::createEngine(profile, nullptr);

5.2 登录房间

传入用户 ID 参数 “userID” 创建 ZegoUser 用户对象后,调用 loginRoom 接口,传入房间 ID 参数 “roomID” 和用户参数 “user”,登录房间。
roomID 和 user 的参数由您本地生成,但是需要满足以下条件:

// 创建用户对象
ZegoUser user("user1", "user1");
// 只有传入 “isUserStatusNotify” 参数取值为 “true” 的 ZegoRoomConfig,才能收到 onRoomUserUpdate 回调。
ZegoRoomConfig roomConfig;
//token 由用户自己的服务端生成,为了更快跑通流程,也可以通过即构控制台获取临时的音视频 token
roomConfig.token = "xxxx";
roomConfig.isUserStatusNotify = true;
// 登录房间
engine->loginRoom(roomID, user, roomConfig);

调用登录房间接口之后,您可通过监听 onRoomStateUpdate 回调实时监控自己在本房间内的连接状态。
只有当房间状态是连接成功时,推流(startPublishingStream)、拉流(startPlayingStream)才能正常收发音视频。

void VideoTalk::onRoomStateUpdate(const std::string &roomID, ZegoRoomState state, int errorCode, const std::string &extendData) {
    if (errorCode != 0) {
        // 房间状态出错
    }

    if (state == ZegoRoomState::ZEGO_ROOM_STATE_CONNECTED) {
        //只有当房间状态是连接成功时,推流(startPublishingStream)、拉流(startPlayingStream)才能正常收发音视频
        //将自己的音视频流推送到 ZEGO 音视频云
    } else if (state == ZegoRoomState::ZEGO_ROOM_STATE_CONNECTING) {
        // 房间连接中
    } else if (state == ZegoRoomState::ZEGO_ROOM_STATE_DISCONNECTED) {
        // 房间连接断开
    }
}

5.3 预览自己的画面,并推送到 ZEGO 音视频云

1. 预览自己的画面

设置预览视图并启动本地预览。
如果希望看到本端的画面,可调用 startPreview 接口设置预览视图,并启动本地预览。

// 设置本地预览视图并启动预览,视图模式采用 SDK 默认的模式,等比缩放填充整个 View
ZegoCanvas canvas((void*)view);
engine->startPreview(&canvas);

2. 将自己的音视频流推送到 ZEGO 音视频云

在用户调用 loginRoom 接口后,可以直接调用 startPublishingStream 接口,传入 streamID,将自己的音视频流推送到 ZEGO 音视频云。您可通过监听 onPublisherStateUpdate 回调知晓推流是否成功。
streamID 由您本地生成,但是需要保证: 同一个 AppID 下,“streamID” 全局唯一。如果同一个 AppID 下,不同用户各推了一条 “streamID” 相同的流,会导致后推流的用户推流失败。
此处示例在调用 loginRoom 接口后立即进行推流。在实现具体业务时,您可选择其他时机进行推流,只要保证先调用 loginRoom 即可。

// 用户调用 loginRoom 之后再调用此接口进行推流
// 在同一个 AppID 下,开发者需要保证“streamID” 全局唯一,如果不同用户各推了一条 “streamID” 相同的流,后推流的用户会推流失败。
engine->startPublishingStream("stream1");

5.4 拉取其他用户的音视频

进行视频通话时,我们需要拉取到其他用户的音视频。
onRoomStreamUpdate:在同一房间内的其他用户将音视频流推送到 ZEGO 音视频云时,我们会在此回调中收到音视频流新增的通知。
我们可以在该回调中,调用 startPlayingStream,传入 “streamID” 拉取播放该用户的音视频。

// 房间内其他用户推流/停止推流时,我们会在这里收到相应流增减的通知
void VideoTalk::onRoomStreamUpdate(const std::string &roomID, ZegoUpdateType updateType, const std::vector<ZegoStream> &streamList, const std::string &extendData) {
    //当 updateType 为 ZEGO_UPDATE_TYPE_ADD 时,代表有音视频流新增,此时我们可以调用 startPlayingStream 接口拉取播放该音视频流
    if (updateType == ZEGO_UPDATE_TYPE_ADD) {
        // 开始拉流,设置远端拉流渲染视图,视图模式采用 SDK 默认的模式,等比缩放填充整个 View
        // 如下 playView 为 UI 窗口句柄
        std::string streamID = streamList[0].streamID;
        ZegoCanvas canvas((void*)playView);
        engine->startPlayingStream(streamID , &canvas);
    }
}

恭喜,你又get一种实现音视频通话的新技能。

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>