?互聯網的不斷發展,各種新技術的興起,原本做管理軟件的我也逐漸轉向從事著互聯網相關的運營產品的開發。尤其是目前抄得最火熱的音視頻互動平臺技術,今天我先列出最基本開發流程,適用于開發視頻會議系統、語音視頻聊天系統、遠程教育平臺以及即時通訊平臺(IM)等。希望對喜歡這方面的朋友有所幫助。同時歡迎各大高手參與討論,相互交流、學習。
首先,知其然,先看看如何開始工作。
下載:http://anychat.storage.aliyun.com/AnyChatCoreSDK_Win32(MBCS)_V4.5.zip
一、初始化
該部分是首先要完成的,包括設置對應的回調函數、設置SDK組件路徑、設置是否產生日志文件等,通常初始化的代碼如下(C++):
01.
// 打開(關閉)的日志記錄功能
02.
BRAC_ActiveCallLog(TRUE);
03.
?????
?04.
// 設置核心組件所在目錄
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,來告訴該如何處理相關的任務(詳情請參考開發文檔)
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.
// 設置臨時文件路徑
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來配合實現,登錄系統成功后,服務器會返回一個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不通時,才由服務器轉發,P2P的NAT打洞過程,以及數據流傳輸策略均由服務器控制,只要有請求,而且對方已打開了自己的音視頻設備,則就能收到對方的音視頻流數據。
3、音視頻的播放與顯示
當收到其它用戶的音頻數據后:
a)如果在初始化時設置了“BRAC_FUNC_AUDIO_AUTOPLAY”標志,則SDK內部將會自動播放,自動混音;
b)如果在初始化時設置了“BRAC_FUNC_AUDIO_CBDATA”標志,則SDK會將解碼后的音頻數據(PCM格式)通過回調函數回調給上層應用。
當收到其它用戶的視頻數據后:
a)如果在初始化時設置了“BRAC_FUNC_VIDEO_AUTODISP”標志,并且調用了API: BRAC_SetVideoPos,則SDK內部將會把視頻顯示到指定的窗體的指定位置(在指定位置上自動迭加一個視頻窗口);
b)如果在初始化時設置了“BRAC_FUNC_VIDEO_CBDATA”標志,則SDK會將解碼后的視頻數據(RGB、YUV)通過回調函數回調給上層應用,由上層應用自己來繪制,或渲染,該模式適合于DirectX、HGE等沒有窗口模式下的應用程序,或是上層應用需要對視頻進行特殊處理的場合,如迭加文字、logo等。
4、文字交互
成功進入房間后, 便可以調用API接口向指定用戶,或是房間中的所有用戶發送文字消息:
2.
CString strInput =
"hello world"
;
3.
BRAC_SendTextMessage(-1,FALSE,strInput.GetBuffer(0),strInput.GetLength());
其它用戶收到自己發送的文字消息后,便會觸發回調函數:文字消息回調函數,通過處理回調消息,然后將收到的文字消息顯示在界面上,便可實現文字的交互。
5、業務邏輯處理?
AnyChat SDK內置的基本邏輯是:當自己的音視頻設備打開后,別的用戶有請求,便會將流媒體數據傳輸給對方,而沒有任何何業務邏輯。
a)如要實現視頻會議系統,則用戶進入房間后,就需要知道誰是主持人,然后打開主持人的視頻;
b)如要實現視頻聊天系統,則用戶進入房間后,就需要知道當前房間有幾個公麥,誰在公麥上,然后打開對應公麥用戶的視頻等;
c)……
這些業務邏輯需要與服務器端的“SDK Filter Plus”或“AnyChat Server SDK”互相配合來實現,具體的實現方案可參考SDK包中的:doc\server\目錄下的《AnyChat Server SDK 開發指南》第6章節。?
四、釋放資源
與前面連接服務器、登錄系統、進入房間對應的,退出系統的過程是:離開房間、注銷系統、釋放資源,通常調用代碼如下(C++):
1.// 離開房間
2.
BRAC_LeaveRoom(-1);
3.
// 注銷系統(將關閉網絡連接)
4.
BRAC_Logout();
5.
// 釋放資源
6.
BRAC_Release();
離開房間后,可以進入新的房間,系統注銷之后,可以再次調用連接服務器的API接口,但是釋放資源后,將不再工作。
需要特別注意一下釋放資源的時機。
完了之后,我們就來知其所以然了,如果你喜歡這個項目,請繼續關注。也可加QQ:992139738