即時通訊開發平臺AnyChat的開發流程及應用

AnyChat開發流程指南

下面列出AnyChatPlatform Core SDK基本開發流程,適用於開發視頻會議系統、語音視頻聊天系統、遠程教育平臺以及即時通訊平臺(IM)等。


一、初始化

該部分是首先要完成的,用於設置SDK的一些行爲,包括設置對應的回調函數、設置SDK組件路徑、設置是否產生日誌文件等,通常初始化AnyChat SDK的代碼如下(C++):


01.// 打開(關閉)SDK的日誌記錄功能

02.BRAC_ActiveCallLog(TRUE);

03.

04.// 設置SDK核心組件所在目錄

05.CHAR szCoreSDKPath[MAX_PATH] = {0};

06.GetModuleFileName(NULL,szCoreSDKPath,sizeof(szCoreSDKPath));

07.(strrchr(szCoreSDKPath,'\\'))[1] = 0;

08.BRAC_SetSDKOption(BRAC_SO_CORESDK_PATH,szCoreSDKPath,strlen(szCoreSDKPath));

09.

10.// 根據BRAC_InitSDK的第二個參數:dwFuncMode,來告訴SDK該如何處理相關的任務(詳情請參考開發文檔)

11.DWORD dwFuncMode =BRAC_FUNC_VIDEO_CBDATA | BRAC_FUNC_AUDIO_AUTOPLAY | BRAC_FUNC_CHKDEPENDMODULE |BRAC_FUNC_AUDIO_VOLUMECALC | BRAC_FUNC_NET_SUPPORTUPNP |BRAC_FUNC_FIREWALL_OPEN |

12.BRAC_FUNC_AUDIO_AUTOVOLUME |BRAC_FUNC_CONFIG_LOCALINI;

13.BRAC_InitSDK(this->GetSafeHwnd()/*NULL*/,dwFuncMode);

14.

15.// 設置錄像臨時文件保存路徑

16.CHAR szRecordDirectory[MAX_PATH] ={0};

17.::GetModuleFileName(NULL,szRecordDirectory,MAX_PATH);

18.(strrchr(szRecordDirectory,'\\'))[1] =0;

19.strcat(szRecordDirectory,"Record");

20.BRAC_SetSDKOption(BRAC_SO_RECORD_TMPDIR,szRecordDirectory,strlen(szRecordDirectory));

21.

22.// 設置錄像文件質量參數

23.DWORD dwVideoBitrate = 200 *1000; // 200kbps

24.BRAC_SetSDKOption(BRAC_SO_RECORD_VIDEOBR,(PCHAR)&dwVideoBitrate,sizeof(DWORD));

25.DWORD dwAudioBitrate = 96 *1000; // 96kbps

26.BRAC_SetSDKOption(BRAC_SO_RECORD_AUDIOBR,(PCHAR)&dwAudioBitrate,sizeof(DWORD));

27.

28.// 設置快照臨時文件保存路徑

29.CHAR szSnapShotDirectory[MAX_PATH]= {0};

30.::GetModuleFileName(NULL,szSnapShotDirectory,MAX_PATH);

31.(strrchr(szSnapShotDirectory,'\\'))[1] =0;

32.strcat(szSnapShotDirectory,"SnapShot");

33.BRAC_SetSDKOption(BRAC_SO_SNAPSHOT_TMPDIR,szSnapShotDirectory,strlen(szSnapShotDirectory));

34.

35.// 設置SDK臨時文件路徑

36.CHAR szTempPath[MAX_PATH] = {0};

37.::GetModuleFileName(NULL,szTempPath,MAX_PATH);

38.(strrchr(szTempPath,'\\'))[1] = 0;

39.strcat(szTempPath,"Temp");

40.BRAC_SetSDKOption(BRAC_SO_CORESDK_TMPDIR,szTempPath,strlen(szTempPath));

41.

42.// 啓用音頻自動參數功能(默認關閉)

43.DWORD bAudioAutoParam = TRUE;

44.BRAC_SetSDKOption(BRAC_SO_AUDIO_AUTOPARAM,(PCHAR)&bAudioAutoParam,sizeof(DWORD));


二、登錄系統

當第一步初始化完成之後,便可以連接服務器、驗證用戶身份。通常調用代碼如下(C++):

1.// 連接服務器

2.BRAC_Connect("211.155.25.90",8906);

3.// 登錄系統

4.BRAC_Login("testuser","",0);

連接服務器與登錄系統都是一個異步的過程,調用後會立即返回,其中:

a、連接服務器成功,或是失敗,將會觸發異步消息

b、登錄系統成功,或是失敗,將會觸發異步消息

所以應用程序需要響應這些異步消息才能知道連接服務器、登錄系統是否成功。


登錄系統成功後,如果需要實現即時通訊應用中的好友列表(AnyChat默認沒有實現),則需要利用AnyChat的擴展API接口與Server SDK來配合實現,具體實現方案可參考SDK包中的:doc\server\目錄下的《AnyChat Server SDK 開發指南》第6章節。


登錄系統成功後,服務器會返回一個32位的用戶ID,如果登錄時沒有傳入密碼參數,則系統會認爲是遊客登錄,並分配一個獨立的用戶ID(如-1-2等),如果登錄時傳入了密碼參數,則登錄請求將會交給“SDK Filter Plus”接口,或“Server SDK”對應的接口,用戶可開發一個自己的服務器插件“SDK Filter Plus”,或是調用“Server SDK”所對應的API來處理用戶身份驗證的請求,完成對用戶ID的管理,實現與第三方系統的互聯互通,詳細內容可參考SDK包中的:doc\server\目錄下的相關文檔。


三、進入房間

在第二步登錄系統成功之後,就可以進入房間,因爲只有在房間中,才能完成語音和視頻的交互。通常調用代碼如下(C++):

1.// 進入房間

2.BRAC_EnterRoom(1,"",0);

房間由服務器動態管理,由32位的房間ID號來唯一標示,當客戶端指定的房間ID號不存在時,服務器將會自動創建。進入房間也是一個異步的過程,是否成功將會觸發異步消息,進入房間成功後,服務器會把當前房間的在線用戶列表傳給客戶端,傳輸完成後,將會觸發異步消息(該消息只觸發一次),只有收到服務器的在線用戶列表後,才能對房間內的用戶進行音視頻的相關操作。


當自己進入房間成功,且收到服務器的在線用戶消息後,有新的用戶進入房間,或是老用戶離開房間,將會觸發異步消息,這樣自己便知道誰進入,或是離開了房間。


1、打開自己的音視頻

進入房間成功之後,便可以打開自己的音視頻設備,通常調用代碼如下(C++):

1.// 打開自己的視頻設備

2.BRAC_UserCameraControl(-1,TRUE);

3.// 打開自己的音頻設備

4.BRAC_UserSpeakControl(-1,TRUE);

打開自己的設備後,並不會立即上傳音視頻流,只有當其它用戶請求自己的音視頻數據時(可單獨請求音頻流,或視頻流)纔對外傳輸,打開自己的音視頻設備,默認是按服務器的配置信息來初始化設備(如採樣分辨率、視頻幀率、音頻的採樣頻率等),如需要在客戶端程序中調節音、視頻質量。


2、請求其它用戶的音視頻

如果需要顯示其它用戶的音視頻,則必須在收到房間用戶列表消息後,請求對方的音視頻流,然後對方纔將音視頻流傳輸過來,通常請求其它用戶的音視頻數據調用代碼如下(C++):

1.// 請求對方的視頻流

2.BRAC_UserCameraControl(dwUserId,TRUE);

3.// 請求對方的音頻流

4.BRAC_UserSpeakControl(dwUserId,TRUE);

數據傳輸優先P2P方式,只有當P2P不通時,才由服務器轉發,P2PNAT打洞過程,以及數據流傳輸策略均由服務器控制,只要有請求,而且對方已打開了自己的音視頻設備,則就能收到對方的音視頻流數據。


3、音視頻的播放與顯示

當收到其它用戶的音頻數據後:

a)如果在初始化時設置了“BRAC_FUNC_AUDIO_AUTOPLAY”標誌,則SDK內部將會自動播放,自動混音;

b)如果在初始化時設置了“BRAC_FUNC_AUDIO_CBDATA”標誌,則SDK會將解碼後的音頻數據(PCM格式)通過回調函數回調給上層應用。


當收到其它用戶的視頻數據後

a)如果在初始化時設置了“BRAC_FUNC_VIDEO_AUTODISP”標誌,並且調用了,則SDK內部將會把視頻顯示到指定的窗體的指定位置(在指定位置上自動迭加一個視頻窗口);

b)如果在初始化時設置了“BRAC_FUNC_VIDEO_CBDATA”標誌,則SDK會將解碼後的視頻數據(RGBYUV)通過回調函數回調給上層應用,由上層應用自己來繪製,或渲染,該模式適合於DirectXHGE等沒有窗口模式下的應用程序,或是上層應用需要對視頻進行特殊處理的場合,如迭加文字、logo等。


4、文字交互

成功進入房間後,便可以調用API接口向指定用戶,或是房間中的所有用戶發送文字消息:

1.// 發送文字消息

2.CString strInput = "helloworld";

3.BRAC_SendTextMessage(-1,FALSE,strInput.GetBuffer(0),strInput.GetLength());

其它用戶收到自己發送的文字消息後,便會觸發回調函數,通過處理回調消息,然後將收到的文字消息顯示在界面上,便可實現文字的交互。


5、業務邏輯處理


AnyChat SDK內置的基本邏輯是:當自己的音視頻設備打開後,別的用戶有請求,便會將流媒體數據傳輸給對方,而沒有任何何業務邏輯。

a)如要實現視頻會議系統,則用戶進入房間後,就需要知道誰是主持人,然後打開主持人的視頻;

b)如要實現視頻聊天系統,則用戶進入房間後,就需要知道當前房間有幾個公麥,誰在公麥上,然後打開對應公麥用戶的視頻等;

c……

這些業務邏輯需要與服務器端的“SDKFilter Plus”AnyChatServer SDK互相配合來實現,具體的實現方案可參考SDK包中的:doc\server\目錄下的《AnyChat Server SDK 開發指南》第6章節。


四、釋放資源

與前面連接服務器、登錄系統、進入房間對應的,退出系統的過程是:離開房間、註銷系統、釋放資源,通常調用代碼如下(C++):

1.// 離開房間

2.BRAC_LeaveRoom(-1);

3.// 註銷系統(將關閉網絡連接)

4.BRAC_Logout();

5.// 釋放資源

6.BRAC_Release();

離開房間後,可以進入新的房間,系統註銷之後,可以再次調用連接服務器的API接口,但是釋放資源後,SDK將不再工作。

需要特別注意一下釋放資源的時機。


Windows平臺AnyChat視頻顯示

1、如何顯示本地視頻,或是其它計算機上的視頻?

aAnyChat的客戶端必須初始化、登錄系統、進入房間成功之後,才能顯示本地視頻或是其它用戶的視頻。

bAnyChat有兩種方式來顯示視頻,分別是:自動顯示(BRAC_FUNC_VIDEO_AUTODISP)、回調視頻數據(BRAC_FUNC_VIDEO_CBDATA,應用程序需要在初始化(BRAC_InitSDK)時設置相關的標誌來告訴AnyChat如何處理視頻的顯示。

當設置了自動顯示(BRAC_FUNC_VIDEO_AUTODISP)時,應用程序需要設置視頻顯示位置(BRAC_SetVideoPos),當打開本地用戶的視頻,或是請求遠程用戶的視頻時,AnyChat內部會自動將視頻顯示在指定的位置;

如果沒有設置自動顯示標誌,而只設置了回調視頻數據(BRAC_FUNC_VIDEO_CBDATA)標誌時,AnyChat內部不會顯示視頻,而是將視頻數據通過回調的方式提交給應用程序,由應用程序自己來繪製;

c)當用戶使用API接口(BRAC_UserCameraControl)打開本地攝像頭後,本地計算機的視頻即可顯示出來;

d)當用戶使用API接口(BRAC_UserCameraControl)請求其它用戶的視頻數據時,只有該用戶打開自己的攝像頭之後,本地計算機才能收到對方用戶的視頻;



2、什麼是視頻顯示驅動,如何選擇?

Windows平臺有多種方式來實現視頻的顯示,常見的有GDI繪圖和DirectShow兩種模式。當設置AnyChat自動顯示視頻標誌時,應用程序可以在這兩種模式之間進行選擇,視頻顯示驅動的選擇需要在初始化(BRAC_InitSDK)成功之後設置,下面的代碼演示了選擇DirectShow顯示驅動:


1.// 選擇AnyChat顯示驅動

2.DWORD dwVideoDriver =BRAC_VSD_DIRECTSHOW;

3.BRAC_SetSDKOption(BRAC_SO_VIDEOSHOW_DRIVERCTRL,(constchar*)&dwVideoDriver, sizeof(DWORD));

AnyChat爲了簡化應用程序開發流程,同時也爲了兼容更早期的版本,默認採用GDI繪圖方式來顯示視頻;GDI繪圖方式適合分辯率不大於CIF352x288),同時幀率低於20FPS的視頻顯示;DirectShow顯示模式適合高分辨率、高幀率的視頻顯示。


DirectShow顯示模式在高視頻質量下更節約資源;


(*注:視頻顯示驅動選擇功能爲AnyChat Platform CoreSDK V4.0版本新增功能)


3、顯示的視頻爲何有些變形,如何設置?

當視頻顯示區域的大小與視頻的原始大小不成比例時,所顯示的視頻將會變形,所以要保證顯示的視頻不變形,則必須保證視頻顯示區域與視頻的原始大小成正比關係;

通過WM_GV_VIDEOSIZECHG消息(V4.0版本新增)可以知道每一個用戶當前原始視頻的大小,應用程序可以根據原始視頻的大小來確定視頻顯示區域的大小,也可以通過APIBRAC_QueryUserState)來獲取用戶當前的視頻大小;

當用戶進入房間時,AnyChat內部會每一個在線用戶觸發一次WM_GV_VIDEOSIZECHG消息;

當用戶修改視頻採集分辨率時,房間內所有用戶都將收到該用戶的WM_GV_VIDEOSIZECHG消息;


4、爲何有時視頻被其它窗口覆蓋,或是最小化後視頻被遮擋,不能自動刷新?

這主要出現在DirectShow顯示模式下,主要原因是應用程序界面重繪之後,底層的DirectShow沒有獲得重繪的消息通知,所以導致視頻被遮擋,解決方案是響應窗口的WM_PAINT消息,在消息處理函數中調用BRAC_RepaintVideo進行視頻的重繪。

AnyChat默認的GDI繪圖模式下,不存在該問題。

AnyChat底層的DirectShow是採用VMRWindowless模式進行視頻顯示,有關該問題的詳細信息可參考微軟官方的開發文檔。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章