基於 Agora SDK 實現 Windows 端的多人視訊互動(基於3.6.2版本)

聲網發表於2022-05-19

本文介紹如何通過 Agora SDK 在 Windows 平臺快速實現互動直播。互動直播和實時通話的區別就在於,直播頻道的使用者有角色之分。你可以將角色設定為主播或者觀眾,其中主播可以收、發流,觀眾只能收流。

Demo 體驗

Agora 在 GitHub 上提供一個開源的實時音視訊通話示例專案 OpenLive-Windows。在實現相關功能前,你可以下載並檢視原始碼:https://github.com/AgoraIO/Basic-Video-Broadcasting/tree/master/OpenLive-Windows-MFC

前提條件

  • Microsoft Visual Studio 2017 或以上版本
  • 支援 Windows 7 或以上版本的 Windows 裝置
  • 有效的 Agora 賬戶(免費註冊)

如果你的網路環境部署了防火牆,請根據聲網文件中心的「應用企業防火牆限制」開啟相關埠。

設定開發環境

本節介紹如何建立專案,並將 Agora SDK 整合至你的專案中。

建立 Windows 專案

參考以下步驟建立一個 Windows 專案。若已有 Windows 專案,直接檢視整合 SDK。

1.開啟 Microsoft Visual Studio 並點選新建專案。

2.進入新建專案視窗,選擇專案型別為 MFC 應用程式,輸入專案名稱,選擇專案儲存路徑,並點選確認。

3.進入MFC 應用程式視窗,選擇應用程式型別為基於對話方塊,並點選完成。

整合 SDK

參考以下步驟將 Agora SDK 整合到你的專案中。

1.配置專案檔案

  • 根據應用場景,從 SDK 下載獲取最新 SDK,解壓並開啟。
  • 開啟已下載的 SDK 檔案,並將其中的 sdk 資料夾複製到你的專案資料夾下。

2.配置專案屬性

在解決方案資源管理器視窗中,右擊專案名稱並點選屬性進行以下配置,配置完成後點選確定。

  • 進入 C/C++ > 常規 > 附加包含目錄選單,點選編輯,並在彈出視窗選擇解壓的libs/include。
  • 進入連結器 > 常規 > 附加庫目錄選單,點選編輯,並在彈出視窗中解壓的libs/x86或libs/x86_64。
  • 進入連結器 > 輸入 > 附加依賴項選單,點選編輯,並在彈出視窗中解壓的 agora_rtc_sdk.lib。

實現音視訊直播

本節介紹如何實現音視訊直播。視訊直播的 API 使用時序見下圖:
image

1. 建立使用者介面

為直觀地體驗音視訊通話,需根據應用場景建立使用者介面(UI)。若專案中已有使用者介面,直接檢視初始化 IRtcEngine。

如果你想實現一個視訊直播,推薦在 UI 上新增以下控制元件:

  • 主播視訊視窗
  • 離開頻道按鈕

當你使用示例專案中的 UI 設計時,你將會看到如下介面:

image

2. 初始化 IRtcEngine

在呼叫其他 Agora API 前,需要建立並初始化 IRtcEngine 物件。

你需要在該步驟中填入專案的 App ID。請參考如下步驟在控制檯建立 Agora 專案並獲取 App ID。

1.登入控制檯,點選左側導航欄的專案管理圖示 img

2.點選建立,按照螢幕提示設定專案名,選擇一種鑑權機制,然後點選提交。

3.在專案管理頁面,你可以獲取該專案的 App ID。

在這裡插入圖片描述
image1019×537 52.3 KB

呼叫 createAgoraRtcEngineinitialize 方法,傳入獲取到的 App ID,即可初始化 IRtcEngine
你也可以根據需求,在初始化時實現其他功能。如註冊使用者加入頻道和離開頻道的回撥(在AgoraObject.h中宣告)。

    // 在主播呼叫 joinChannel 方法後,此回撥會報告加入頻道的主播資訊。
    BOOL JoinChannel(LPCTSTR lpChannelName, UINT nUID = 0, LPCSTR lpDynamicKey = NULL);

    // 在主播呼叫 leaveChannel 方法後,此回撥會報告離開頻道的主播資訊。
    BOOL LeaveCahnnel();
  //靜音本地音訊
BOOL MuteLocalAudio(BOOL bMuted = TRUE);
    BOOL IsLocalAudioMuted();
  //靜音所有遠端音訊
    BOOL MuteAllRemoteAudio(BOOL bMuted = TRUE);
    BOOL IsAllRemoteAudioMuted();
  //靜音本地視訊
    BOOL MuteLocalVideo(BOOL bMuted = TRUE);
    BOOL IsLocalVideoMuted();
  //靜音所有遠端視訊
    BOOL MuteAllRemoteVideo(BOOL bMuted = TRUE);
    BOOL IsAllRemoteVideoMuted();
    BOOL IsAllRemoteVideoMuted();

3.設定頻道模式

初始化結束後,呼叫 setChannelProfile 方法,將頻道模式設為直播。

一個 IRtcEngine 只能使用一種頻道模式。如果想切換為其他模式,需要先呼叫 release 方法釋放當前的 IRtcEngine 例項,然後呼叫 createAgoraRtcEngineinitialize 方法建立一個新例項,再呼叫 setChannelProfile 設定新的頻道模式。

    BOOL SetChannelProfile(BOOL bBroadcastMode);
    BOOL IsBroadcastMode();

4. 設定使用者角色

直播頻道有兩種使用者角色:主播和觀眾,其中預設的角色為觀眾。設定頻道模式為直播後,你可以在 App 中參考如下步驟設定使用者角色:

  • 讓使用者選擇自己的角色是主播還是觀眾
  • 呼叫 setClientRole 方法,然後使用使用者選擇的角色進行傳參

注意,直播頻道內的使用者,只能看到主播的畫面、聽到主播的聲音。加入頻道後,如果你想切換使用者角色,也可以呼叫 setClientRole 方法。

//在AgoraObject.h中宣告
    BOOL SetClientRole(CLIENT_ROLE_TYPE role, LPCSTR lpPermissionKey = NULL);
    int  GetClientRole() { return m_nRoleType; };
//在AgoraObject.cpp實現
BOOL CAgoraObject::SetClientRole(CLIENT_ROLE_TYPE role, LPCSTR lpPermissionKey)
{
    // 設定使用者角色。
    int nRet = m_lpAgoraEngine->setClientRole(role);
    m_nRoleType = role;
    return nRet == 0 ? TRUE : FALSE;
}
/ 建立選擇使用者角色的對話方塊。
void CEnterChannelDlg::OnCbnSelchangeCmbRole()
{
    int nSel = m_ctrRole.GetCurSel();
    if (nSel == 0)
        CAgoraObject::GetAgoraObject()->SetClientRole(CLIENT_ROLE_BROADCASTER);
    else
        CAgoraObject::GetAgoraObject()->SetClientRole(CLIENT_ROLE_AUDIENCE);
}

5. 設定本地檢視

如果你想實現一個語音直播,可以直接檢視加入頻道。

成功初始化 IRtcEngine 物件後,需要在加入頻道前設定本地檢視,以便主播在直播中看到本地影像。參考以下步驟設定本地檢視(OpenLiveDig.cpp):

  • 呼叫 enableVideo 方法啟用視訊模組。
  • 呼叫 setupLocalVideo 方法設定本地檢視。
// 啟用視訊模組。
CAgoraObject::GetAgoraObject()->EnableVideo(TRUE);

// 設定本地檢視。
VideoCanvas vc;

    vc.uid = 0;
    vc.view = m_dlgVideo.GetLocalVideoWnd();
    vc.renderMode = RENDER_MODE_TYPE::RENDER_MODE_FIT;

    //cancel setVideoProfile bitrate since version 2.1.0
    int nVideoSolution = m_dlgSetup.GetVideoSolution();
//
    VideoEncoderConfiguration config;
    config.bitrate = m_dlgSetup.GetBirate();
    config.frameRate = (FRAME_RATE)m_dlgSetup.GetFPS();
    SIZE resolution = m_dlgSetup.GetVideoResolution();
    config.dimensions.width = resolution.cx;
    config.dimensions.height = resolution.cy;
    lpRtcEngine->setVideoEncoderConfiguration(config);
//
    m_dlgVideo.SetWindowText(strChannelName);
    lpRtcEngine->setupLocalVideo(vc);
    lpRtcEngine->startPreview();

6. 加入頻道

完成設定角色和本地檢視後(視訊直播場景),你就可以呼叫 joinChannel 方法加入頻道。你需要在該方法中傳入如下引數:

  • channelName : 傳入能標識頻道的頻道 ID。輸入頻道 ID 相同的使用者會進入同一個頻道。
  • token:傳入能標識使用者角色和許可權的 Token。可設為如下一個值:若專案已啟用 App 證書,請使用 Token。

    • NULL
    • 臨時 Token。臨時 Token 服務有效期為 24 小時。你可以在控制檯裡生成一個臨時 Token,詳見獲取臨時 Token。
    • 在你的伺服器端生成的 Token。在安全要求高的場景下,我們推薦你使用此種方式生成的 Token,詳見生成 Token。
  • uid : 本地使用者的 ID。資料型別為整型,且頻道內每個使用者的 uid 必須是唯一的。若將 uid 設為 0,則 SDK 會自動分配一個 uid ,並在 onJoinChannelSuccess 回撥中報告。

更多的引數設定注意事項請在聲網文件中心查詢並參考 joinChannel 介面中的引數描述。

// 加入頻道。
std::string token = lpAgoraObject->GetToken();
lpAgoraObject->JoinChannel(strChannelName, 0, token.length() > 0 ? token.c_str() : NULL);

7. 設定遠端檢視

視訊直播中,不論你是主播還是觀眾,都應該看到頻道中的所有主播。在加入頻道後,可通過呼叫 setupRemoteVideo 方法設定遠端主播的檢視。

遠端主播成功加入頻道後,SDK 會觸發 onFirstRemoteVideoDecoded 回撥,該回撥中會包含這個主播的 uid 資訊。在該回撥中呼叫 setupRemoteVideo 方法,傳入獲取到的 uid ,設定該主播的檢視(AGEngineEventHandler.h)。

// 在引擎收到第一幀遠端視訊流並解碼成功時,會觸發此回撥(AGEngineEventHandler.cpp)。
void CAGEngineEventHandler::onFirstRemoteVideoDecoded(uid_t uid, int width, int height, int elapsed)
{
    LPAGE_FIRST_REMOTE_VIDEO_DECODED lpData = new AGE_FIRST_REMOTE_VIDEO_DECODED;
    lpData->uid = uid;
    lpData->width = width;
    lpData->height = height;
    lpData->elapsed = elapsed;
    if(m_hMainWnd != NULL)
        ::PostMessage(m_hMainWnd, WM_MSGID(EID_FIRST_REMOTE_VIDEO_DECODED), (WPARAM)lpData, 0);
}

8. 離開頻道

根據場景需要,如結束通話、關閉 App 或 App 切換至後臺時,呼叫 leaveChannel 離開當前通話頻道。

BOOL CAgoraObject::LeaveCahnnel()
{
    m_lpAgoraEngine->stopPreview();
    int nRet = m_lpAgoraEngine->leaveChannel();

    m_nSelfUID = 0;
    bJoinedChannel = false;
    return nRet == 0 ? TRUE : FALSE;
}
//關閉引擎
void CAgoraObject::CloseAgoraObject()
{
    if(m_lpAgoraEngine != NULL)
        m_lpAgoraEngine->release();
     
    if(m_lpAgoraObject != NULL)
        delete m_lpAgoraObject;

    m_lpAgoraEngine = NULL;
    m_lpAgoraObject = NULL;
}

示例程式碼

你可以在 OpenLive-Windows 示例程式碼中檢視完整的原始碼和程式碼邏輯,本文使用的是C++的MFC專案。

github:https://github.com/AgoraIO/Ba...

執行專案

在 Windows 裝置中執行該專案。當成功開始視訊直播時,主播可以看到自己的畫面;觀眾可以看到主播的畫面(當前配置為Debug模式,x64系統)。

//開啟介面

image
//測試攝像頭

image

//開始直播,厚碼

在這裡插入圖片描述
image938×715 109 KB

相關文章