如何基於 ZEGO SDK 實現 Windows 一對一音視訊聊天應用

ZEGO即構開發者發表於2022-04-08

網際網路發展至今,實時視訊和語音通話越來越被大眾所依賴。

今天,我們將會繼續介紹如何基於ZEGO SDK實現音視訊通話功能,前兩篇文章分別介紹了Android,Flutter平臺的實現方式,感興趣的小夥伴可點選瞭解: AndroidFlutter

接下來,我們將會一起開發一個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,選擇“檔案 > 新建 > 專案”選單。
在這裡插入圖片描述

2.在新建專案視窗,選擇專案型別為“MFC 應用程式”,輸入專案名稱,選擇專案儲存路徑,並單擊“確定”。
圖片: https://uploader.shimo.im/f/oMfNQRz84XOtr3YF.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJhdWQiOiJhY2Nlc3NfcmVzb3VyY2UiLCJleHAiOjE2NDkzNDY4NTMsImciOiIyWG8zTzdOTHhqa09pN3NVIiwiaWF0IjoxNjQ5MzQ2NTUzLCJ1c2VySWQiOjc1NzgyMTAwfQ.7oOKh_-TmLIg9_EWLDjmNZwbTsHdfDl53CZLChp1W7E

3.進入 MFC 應用程式視窗,選擇“應用程式型別”為“基於對話方塊”,並單擊“完成”。
在這裡插入圖片描述

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” 目錄。
在這裡插入圖片描述

2.將 “lib” 目錄加入到庫搜尋路徑。
選擇“配置屬性 > 連結器 > 常規”選單,在“附加庫目錄”中新增 “lib/x86” 或 “lib/x64” 目錄。
在這裡插入圖片描述

3.指定連結庫 “ZegoExpressEngine.lib”。
選擇“配置屬性 > 連結器 > 輸入”選單,在“附加依賴項”中新增 “ZegoExpressEngine.lib”。
在這裡插入圖片描述

5 實現流程

如以下流程圖,使用者A與B通過 ZEGO Express SDK 進行視訊通話,以使用者 A 拉取使用者 B 的流為例:
在這裡插入圖片描述

為保證實時音視訊的通話質量,推拉流關鍵流程需按照API的正確呼叫時序進行,完整時序如下圖:
在這裡插入圖片描述

5.1 建立引擎

1. 建立介面

根據場景需要,為您的專案建立視訊通話的使用者介面。我們推薦您在專案中新增如下元素:

  • 本地視訊視窗
  • 遠端視訊視窗
  • 結束通話按鈕

在這裡插入圖片描述

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歌房等多種音視訊通話場景;

獲取Demo、開發文件、技術支援,訪問即構文件中心
SDK的優惠活動、熱門產品,?點選聯絡商務
註冊即構ZEGO開發者帳號,快速開始...

相關文章