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

来源:https://www.cnblogs.com/zegodeveloper/archive/2022/04/08/16115656.html
-Advertisement-
Play Games

互聯網發展至今,實時視頻和語音通話越來越被大眾所依賴。 今天,我們將會繼續介紹如何基於ZEGO SDK實現音視頻通話功能,前兩篇文章分別介紹了Android,Flutter平臺的實現方式,感興趣的小伙伴可點擊瞭解: [Android](https://zegoguanwang.datasink.s... ...


互聯網發展至今,實時視頻和語音通話越來越被大眾所依賴。

今天,我們將會繼續介紹如何基於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的優惠活動、熱門產品,

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言大家拍照的時候會用到全景嗎?在拍一個環境的時候還是會有很多人用全景的吧 ,今天教大家如何用Python拼接全景圖片。 圖像的全景拼接,即“縫合”兩張具有重疊區域的圖來創建一張全景圖。其中用到了電腦視覺和圖像處理技術有:關鍵點特征檢 測、局部不變特征、關鍵特征點匹配、RANSAC(Random ...
  • (Java 演算法的 ACM 模式) 前言 經常在 LeetCode 上用核心代碼模式刷題的小伙伴突然用 ACM 模式可能會適應不過來,把時間花在輸入輸出上很浪費時間,因此本篇筆記對 Java 演算法的 ACM 模式做了個小總結; 除此之外,需要註意一些小細節: 1. 數字讀取到字元串讀取間需要用 in ...
  • 上篇文章對併發的理論基礎進行了回顧,主要是為什麼使用多線程、多線程會引發什麼問題及引發的原因,和怎麼使用Java中的多線程去解決這些問題。 正所謂,知其然知其所以然,這是學習一個知識遵循的原則。 推薦讀者先行查看併發編程的理論知識,以便可以絲滑入戲。 併發編程系列之一併發理論基礎 本篇文章重點在於J ...
  • 原創:微信公眾號 【阿Q說代碼】,歡迎分享,轉載請保留出處。 近期疫情形勢嚴峻,情形不容樂觀,周末也不敢出去浪了,躲在家裡“葛優躺”。閑來無事,又翻了遍Spring的源碼。不翻不知道,一翻嚇一跳,之前翻過的源碼已經吃進了肚子里,再見亦是陌生人。 個人建議:為了以後能快速的撿起某個知識點,最好的方法還 ...
  • 大家都看過電影《無間道》吧。在電影《無間道》中,劉建明(劉德華飾)作為黑幫的卧底在一次行動中發現了警察的卧底陳永仁(梁朝偉飾)與黃警督(黃秋生飾)通過摩斯電碼進行通訊,經過緊急的群發區域簡訊 “有內鬼,終止交易” 避免了黑幫頭目被抓。 通過動圖能看到黃警督和陳永仁僅通過手指的敲擊就能完成通訊,是不是 ...
  • 小二是新來的實習生,作為技術 leader,我還是很負責任的,有什麼鍋都想甩給他,啊,不,一不小心怎麼把心裡話全說出來了呢?重來! 小二是新來的實習生,作為技術 leader,我還是很負責任的,有什麼好事都想著他,這不,我就安排了一個整合SpringSecurity+JWT實現登錄認證的小任務交,沒 ...
  • 大家好,好久沒有輸出博文了,一是因為比較忙,另外一個原因是最近主要的精力是在給 AgileConfig 添加一個新的功能:服務註冊與發現。 先說說為什麼會添加這個功能。我自己的項目是用 Consul 來做為服務註冊發現組件的。自從我上線了 AgileConfig 做為配置中心後,我就很少去 Cons ...
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 CentOS8 AnolisOS8 yum安裝失敗 今天有人反饋伺服器卡,登錄上伺服器,想看下CPU以及記憶體使用情況,覺得top看不太清晰,想使用htop,發現沒有,就想安裝一個htop,輸入命令,yum安裝 yum install htop 沒 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...