基於 Agora SDK 實現 Windows 端的一對一視訊通話(基於3.6.2版本)

聲網Agora發表於2022-05-17

前提條件

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

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

設定開發環境

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

建立 Windows 專案

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

建立 新的MFC專案

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

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

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

初學者直接下載文中後面的github地址專案

整合 SDK

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

1.配置專案檔案

  • 根據應用場景,從 官網獲取最新 SDK,解壓並開啟。
  • 將下載包中的 sdk 資料夾複製到你的專案資料夾下。
  • 目前3.6.2版本,目錄結構為libs/include,libs/x86,libs/x86_64

2.配置專案屬性

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

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

實現音視訊通話

本節介紹如何實現音視訊通話。視訊通話的 API 呼叫時序見下圖:
image

1. 建立使用者介面

根據場景需要,為你的專案建立音視訊通話的使用者介面。若已有使用者介面,可以直接初始化 IRtcEngine。

如果你想實現一個視訊通話,我們推薦你新增如下 UI 元素:

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

當你使用本文連結中,GitHub專案中的介面時,你將會看到如下介面:
agor

2. 初始化 IRtcEngine

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

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

1.登入控制檯,點選左側導航欄的專案管理圖示 img
2.點選建立,按照螢幕提示設定專案名,選擇一種鑑權機制,然後點選提交。
3.在專案管理頁面,你可以獲取該專案的 App ID。

呼叫 createAgoraRtcEngineinitialize 方法,傳入獲取到的 App ID,即可初始化 IRtcEngine

你還可以根據場景需要,在初始化時註冊想要監聽的回撥事件,如本地使用者加入頻道,及解碼遠端使用者視訊首幀等。

/** 
    create or return existing AgoraObject 
*/
CAgoraObject *CAgoraObject::GetAgoraObject(LPCTSTR lpAppId)
{
    if (m_lpAgoraObject == NULL)
        m_lpAgoraObject = new CAgoraObject();
    if (m_lpAgoraEngine == NULL)
        m_lpAgoraEngine = (IRtcEngine *)createAgoraRtcEngine();
    if (lpAppId == NULL)
        return m_lpAgoraObject;
    RtcEngineContext ctx;
    ctx.eventHandler = &m_EngineEventHandler;
#ifdef UNICODE
    char szAppId[128];
    ::WideCharToMultiByte(CP_ACP, 0, lpAppId, -1, szAppId, 128, NULL, NULL);
    ctx.appId = szAppId;
#else
    ctx.appId = lpAppId;
#endif
    m_lpAgoraEngine->initialize(ctx);
    return m_lpAgoraObject;
}
// 繼承 IRtcEngineEventHandler 類中的回撥與事件。
class CAGEngineEventHandler :
    public IRtcEngineEventHandler
{
public:
    CAGEngineEventHandler(void);
    ~CAGEngineEventHandler(void);

    void SetMsgReceiver(HWND hWnd = NULL);
    HWND GetMsgReceiver() {return m_hMainWnd;};
    // 本地使用者成功加入頻道時,會觸發該回撥。
    virtual void onJoinChannelSuccess(const char* channel, uid_t uid, int elapsed);
    // 本地重新加入頻道時,會觸發該回撥。
    virtual void onRejoinChannelSuccess(const char* channel, uid_t uid, int elapsed);
    virtual void onWarning(int warn, const char* msg);
    virtual void onError(int err, const char* msg);
    virtual void onAudioQuality(uid_t uid, int quality, unsigned short delay, unsigned short lost);
    virtual void onAudioVolumeIndication(const AudioVolumeInfo* speakers, unsigned int speakerNumber, int totalVolume);
    // 本地使用者成功離開頻道時,會觸發該回撥。
    virtual void onLeaveChannel(const RtcStats& stat);
//以下還有多個擴充套件方法
/*
....
/*
private:
    HWND        m_hMainWnd;

};

3. 設定本地檢視

如果你想實現一個語音通話,可以直接跳過這一步,檢視下一步「加入頻道」。

成功初始化 IRtcEngine 物件後,需要在加入頻道前設定本地檢視,以便在通話中看到本地影像。預設開啟本地攝像頭,參考以下步驟設定本地檢視:

  • 呼叫 enableVideo 方法啟用視訊模組。
  • 呼叫 setupLocalVideo 方法設定本地檢視。
// 啟用視訊模組。m_lpAgoraObject->GetEngine()->enableVideo();// 設定本地檢視。
//在檔案AgoraTutorialDlg.cpp中
 BOOL CAgoraTutorialDlg::OnInitDialog(){
VideoCanvas vc;

    vc.uid = 0;
    vc.view = m_wndLocal.GetSafeHwnd();
    vc.renderMode = RENDER_MODE_FIT;

    m_lpAgoraObject->GetEngine()->setupLocalVideo(vc);
//...

}

4. 加入頻道

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

  • channelName : 傳入能標識頻道的頻道 ID。輸入頻道 ID 相同的使用者會進入同一個頻道。
  • token:傳入能標識使用者角色和許可權的 Token。可設為如下一個值:

注:若專案已啟用 App 證書,請使用 Token。

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

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

// 加入頻道。在檔案"AgoraObject.cpp"中
BOOL CAgoraObject::JoinChannel(LPCTSTR lpChannelName, UINT nUID,LPCTSTR lpToken)
{
    int nRet = 0;
#ifdef UNICODE
    CHAR szChannelName[128];
    ::WideCharToMultiByte(CP_UTF8, 0, lpChannelName, -1, szChannelName, 128, NULL, NULL);
    char szToken[128];
    ::WideCharToMultiByte(CP_UTF8, 0, lpToken, -1, szToken, 128, NULL, NULL);

    if(0 == _tcslen(lpToken))
        nRet = m_lpAgoraEngine->joinChannel(NULL, szChannelName, NULL, nUID); 
    else
        nRet = m_lpAgoraEngine->joinChannel(szToken, szChannelName, NULL, nUID);
#else
    if(0 == _tcslen(lpToken))
        nRet = m_lpAgoraEngine->joinChannel(NULL, lpChannelName, NULL, nUID);
    else
        nRet = m_lpAgoraEngine->joinChannel(lpToken, lpChannelName, NULL, nUID);
#endif
    if (nRet == 0)
        m_strChannelName = lpChannelName;
    return nRet == 0 ? TRUE : FALSE;
}

5. 設定遠端檢視

視訊通話中,通常你也需要看到其他使用者。在加入頻道後,可通過呼叫 setupRemoteVideo 方法設定遠端使用者的檢視。

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

// SDK 接收到第一幀遠端視訊併成功解碼時,會觸發該回撥。// 在該回撥中呼叫 setupRemoteVideo 方法設定遠端檢視。存在於檔案“AgoraTutorialDlg.cpp”中
LRESULT CAgoraTutorialDlg::OnFirstRemoteVideoDecoded(WPARAM wParam, LPARAM lParam)
{
    LPAGE_FIRST_REMOTE_VIDEO_DECODED lpData = (LPAGE_FIRST_REMOTE_VIDEO_DECODED)wParam;
    VideoCanvas vc;
    vc.renderMode = RENDER_MODE_FIT;
    vc.uid = lpData->uid;
    vc.view = m_wndRemote.GetSafeHwnd();
    m_lpAgoraObject->GetEngine()->setupRemoteVideo(vc);//設定遠端檢視
    delete lpData;
    return 0;
}

6. 離開頻道

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

/**
    Leave the channel
*/
BOOL CAgoraObject::LeaveChannel()
{
    m_lpAgoraEngine->stopPreview();
    int nRet = m_lpAgoraEngine->leaveChannel();

    return nRet == 0 ? TRUE : FALSE;
}

示例程式碼

你可以在 Agora-Windows-Tutorial-1to1 示例專案的 AgoraTutorialDlg.cpp 檔案中檢視完整的原始碼和程式碼邏輯。

相關文章