視頻聊天室開發詳解

?互聯網的不斷發展,各種新技術的興起,原本做管理軟件的我也逐漸轉向從事著互聯網相關的運營產品的開發。尤其是目前抄得最火熱的音視頻互動平臺技術,今天我先列出最基本開發流程,適用于開發視頻會議系統、語音視頻聊天系統、遠程教育平臺以及即時通訊平臺(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接口向指定用戶,或是房間中的所有用戶發送文字消息:

1.// 發送文字消息
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


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450140.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450140.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450140.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android應用開發—ViewPager FragmentPagerAdapter和FragmentStatePagerAdapter下Fragment的生命周期

ViewPager配合不同的PagerAdapter,對應Fragment的生命周期有著不同的表現,了解這個生命周期機制對于開發者選擇合適的PagerAdapter實現不同的效果,有著很大的幫助。 FragmentPagerAdapter和FragmentStatePagerAdapter的區別: Fra…

Bash常用快捷鍵及其作用

Bash常用快捷鍵及其作用 在 Bash 中有非常多的快捷鍵,如果可以熟練地使用這些快捷鍵,可有效地提高我們的工作效率。只是快捷鍵相對較多,不太好記憶,這就要多加練習和使用。這些快捷鍵如表 1 所示。 表 1 Bash 常用快捷鍵快捷鍵作 …

Putty(菩提)遠程連接服務器教程

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 百度不準直接用其圖片,我也懶得去偷,只是記錄下原文地址: https://jingyan.baidu.com/article/4543…

V8 中更快的異步函數和 promises

原文作者:Maya Lekova and Benedikt Meurer譯者:UC 國際研發 Jothy寫在最前:歡迎你來到“UC國際技術”公眾號,我們將為大家提供與客戶端、服務端、算法、測試、數據、前端等相關的高質量技術文章,不限于原創與翻譯。一…

Android應用開發—淺談MVX模式

MVX模式的文章太多了,這里不會再重述,關鍵我還不太懂,本文會從自己的一些思考,分析下MVX的分離思想,先占個坑! Android應用架構這篇文章最后講到: Activity和Fragment變得非常輕量。他們唯一的…

音視頻互動平臺--P2P通信技術

壓縮包可以從這里獲得:http://anychat.storage.aliyun.com/AnyChatCoreSDK_Win32(MBCS)_V4.5.zip 下載后,首先將其解壓到一個臨時文件夾中,然后開始后續工作。 編譯后我們獲得的是.lib文件。 AnyChat SDK向上層應用開放了內核的P2P連接策略…

pigz 壓縮

壓縮工具--pigz 壓縮: tar cvf - 目錄名 | pigz -9 -p 24 > file.tgz pigz:用法-9是壓縮比率比較大,-p是指定cpu的核數。 解壓: pigz -d file.tgz 這時候是tar包,那么在用 tar -xvf file.tar 解包。 速度比較gz.tar格式的壓縮…

exgcd模板

逆元模板P1082 1 #include <cstdio>2 #include <algorithm>3 4 int exgcd(int a, int b, int &x, int &y) {5 if(!b) {6 x 1;7 y 0;8 return a;9 } 10 int g exgcd(b, a % b, x, y); 11 std::swap(x, y); 12 …

有關eclipse for java ee版本遇到的坑( Context initialization failed)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 這幾天把以前網上看的視頻的源代碼拷貝到eclipse下面進行學習&#xff0c;當時用的是eclipse-jee-neon-M4a-win32-x86_64這個版本的ecli…

Android應用開發—TabLayout定制化Tab樣式

TabLayout的使用詳解基于此文&#xff0c;了解下setCustomView(childView)的使用。 TabLayout去掉指示器效果&#xff1a; app:tabIndicatorHeight"0dp"

即時通訊開發(逐行、隔行掃描)

早期的電視制式均采用隔行掃描&#xff0c;但是現在很多的高清、專業級的視頻采集卡都是采用逐行掃描模式&#xff0c;雖然現在的視頻設備和數字視頻技術已近有了很大的發展和進步&#xff0c;但是在時候中這兩種掃盲模式和顯示模式一直還存在&#xff0c;在前面我們介紹第四代…

ASP.NET Core 2.2 : 十六.扒一扒2.2版更新的新路由方案

ASP.NET Core 2.2 : 十六.扒一扒2.2版更新的新路由方案 原文:ASP.NET Core 2.2 : 十六.扒一扒2.2版更新的新路由方案ASP.NET Core 從2.2版本開始&#xff0c;采用了一個新的名為Endpoint的路由方案&#xff0c;與原來的方案在使用上差別不大&#xff0c;但從內部運行方式上來說…

ES6學習筆記

ES6學習筆記 在學習ES6的過程中做的一些記錄&#xff0c;用于未來的快速回憶。let&const 作用域的概念 ES6新增塊級作用域的概念&#xff08;一個大括號括起來的部分就是一個塊作用域&#xff09;let與const用于在塊級作用域中聲明變量&#xff0c;該變量僅在當前塊級作用域…

用jenkins創建節點

原料&#xff1a;(1)jre下載鏈接&#xff1a;https://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html (2)jdk:下載鏈接&#xff1a;https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 一、創建SLAVE節點…

統計git倉庫一些commit數據

基于git統計某個人的代碼提交行數 git log --author"xxx" --prettytformat: --since1.hour.ago --numstat | awk { add $1 ; subs $2 ; loc $1 - $2 } END { printf "added lines: %s removed lines : %s total lines: %s\n",add,subs,loc } - 統計倉…

JAXB: XML綁定的Java體系結構

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 用于XML綁定的Java體系結構&#xff08;JAXB&#xff09;是一種軟件框架&#xff0c;它允許Java開發人員將Java 類映射到XML表示。JAXB提…

解決 Script Error 的另類思路

2019獨角獸企業重金招聘Python工程師標準>>> 本文由小芭樂發表 前端的同學如果用 window.onerror 事件做過監控&#xff0c;應該知道&#xff0c;跨域的腳本會給出 "Script Error." 提示&#xff0c;拿不到具體的錯誤信息和堆棧信息。 這里讀者可以跟我一…

大平臺的局限

這篇文章算是二稿。初稿使的是慣用的賣弄筆法&#xff0c;寫到盡興時去查了查資料&#xff0c;哦草&#xff0c;錯了好多。悶悶不樂。后來就不敢再鬼扯&#xff0c;老老實實干巴巴地講觀點。 做產品的人都喜歡大平臺&#xff0c;好像男人都喜歡大胸脯女郎&#xff0c;但是胸脯大…

Lisenter筆記

EventListener與EventObject要完成在線用戶列表的監聽器&#xff0c;需要使用如下幾個接口&#xff1a;ServletContextListener接口&#xff1a;在上下文初始化時設置一個空的集合到application之中&#xff1b;HttpSessionAttributeListener接口&#xff1a;用戶增加session屬…

Android應用開發—重載fragment構造函數導致的lint errors

背景&#xff1a;在一次release打包中發現lint報以下錯誤&#xff1a; Error: Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead [ValidFragment] 根據后面的log提示是由于重載了fragment的構造函數&…