Windows 实现一对一音视频通话,基于实时音视频 ZEGO SDK 开发

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

今天,我们将会继续介绍如何基于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,选择“文件 > 新建 > 项目”菜单。
Windows 实现一对一音视频通话,基于实时音视频 ZEGO SDK 开发
  1. 在新建项目窗口,选择项目类型为“MFC 应用程序”,输入项目名称,选择项目存储路径,并单击“确定”。
Windows 实现一对一音视频通话,基于实时音视频 ZEGO SDK 开发
  1. 进入 MFC 应用程序窗口,选择“应用程序类型”为“基于对话框”,并单击“完成”。
Windows 实现一对一音视频通话,基于实时音视频 ZEGO SDK 开发

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” 目录。
Windows 实现一对一音视频通话,基于实时音视频 ZEGO SDK 开发
  1. 将 “lib” 目录加入到库搜索路径。
    选择“配置属性 > 链接器 > 常规”菜单,在“附加库目录”中添加 “lib/x86” 或 “lib/x64” 目录。
Windows 实现一对一音视频通话,基于实时音视频 ZEGO SDK 开发
  1. 指定链接库 “ZegoExpressEngine.lib”。
    选择“配置属性 > 链接器 > 输入”菜单,在“附加依赖项”中添加 “ZegoExpressEngine.lib”。
Windows 实现一对一音视频通话,基于实时音视频 ZEGO SDK 开发

5 音视频通话实现流程

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

Windows 实现一对一音视频通话,基于实时音视频 ZEGO SDK 开发

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

Windows 实现一对一音视频通话,基于实时音视频 ZEGO SDK 开发

5.1 创建引擎

1. 创建界面

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

  • 本地视频窗口
  • 远端视频窗口
  • 结束通话按钮
Windows 实现一对一音视频通话,基于实时音视频 ZEGO SDK 开发

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 的参数由您本地生成,但是需要满足以下条件:

  • 同一个 AppID 内,需保证 “roomID” 全局唯一。
  • 同一个 AppID 内,需保证 “userID” 全局唯一,建议开发者将其设置成一个有意义的值,可将 “userID” 与自己业务账号系统进行关联。
// 创建用户对象
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一种实现音视频通话的技能,ZEGO SDK助你快速搭建,10多种开发语言,4行代码,30分钟,玩转多端实时通讯。同时即构每月赠送10000分钟免费时长,可实现秀场直播、语聊房、K歌房等多种音视频通话场景。

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论