打造自己的視訊會議系統 GGMeeting(附送原始碼)
自從在部落格園釋出以來,結識了很多做IM的朋友,然後我和我的夥伴們也接到了很多與IM相關的專案。相比在釋出GG之前難以接到專案的狀況相比,現在簡直太幸福了,雖然做專案很辛苦,但畢竟有錢賺,那辛苦也值了。
飲水思源,這裡要感謝部落格園提供了這麼好的一個平臺,讓我們能展現自己的實力,提升我們的知名度,然後才能接到了更多專案。所以,我強烈建議那些希望接專案、接私單的朋友,都來部落格園寫部落格吧,寫出自己的知名度後,真是好處多多!
言歸正傳,前段時間做了個線上教育培訓的專案,與視訊會議比較類似,所以了,我打算像GGTalk開源即時通訊系統一樣,搞一個開源視訊會議系統並把實現的原理和原始碼都分享出來,讓有興趣的朋友可以參考下。繼承GG的名稱,我把這個開源視訊會議系統命名為GGMeeting,目前版本為1.0,後續功能會不斷增強。
一般而言,視訊會議的主要核心功能是:多人語音聊天、多人視訊聊天、公共電子白板、會議房間管理。本文我們將介紹視訊會議系統的主要功能及其實現原理,後面有空在介紹詳細每個功能的詳細實現細節。
想要直接下載體驗的朋友請點選:
一.語音通話
1.基礎模型
在視訊會議中,網路語音通話通常多對多的的,但就模型層面來說,我們討論一個方向的通道就可以了。一方說話,另一方則聽到聲音。看似簡單而迅捷,但是其背後的流程卻是相當複雜的。我們將其經過的各個主要環節簡化成下圖所示的概念模型:
這是一個最基礎的模型,由五個重要的環節構成:採集、編碼、傳送、解碼、播放。
語音採集指的是從麥克風採集音訊資料,即聲音樣本轉換成數字訊號。其涉及到幾個重要的引數:取樣頻率、取樣位數、聲道數。
假設我們將採集到的音訊幀不經過編碼,而直接傳送,那麼我們可以計算其所需要的頻寬要求,仍以上例:320*100 =32KBytes/s,如果換算為bits/s,則為256kb/s。這是個很大的頻寬佔用。而通過網路流量監控工具,我們可以發現採用類似QQ等IM軟體進行語音通話時,流量為3-5KB/s,這比原始流量小了一個數量級。而這主要得益於音訊編碼技術。 所以,在實際的語音通話應用中,編碼這個環節是不可缺少的。目前有很多常用的語音編碼技術,像G.729、iLBC、AAC、SPEEX等等。
當一個音訊幀完成編碼後,即可通過網路傳送給通話的對方。對於語音對話這樣Realtime應用,低延遲和平穩是非常重要的,這就要求我們的網路傳送非常順暢。
當對方接收到編碼幀後,會對其進行解碼,以恢復成為可供音效卡直接播放的資料。
完成解碼後,即可將得到的音訊幀提交給音效卡進行播放。
2.高階功能
如果僅僅依靠上述的技術就能實現一個效果良好的應用於廣域網上的語音對話系統,那就太easy了。正是由於很多現實的因素為上述的概念模型引入了眾多挑戰,使得網路語音系統的實現不是那麼簡單,其涉及到很多專業技術。一個“效果良好”的語音對話系統應該達到如下幾點:低延遲,背景噪音小,聲音流暢、沒有卡、停頓的感覺,沒有迴音。
對於低延遲,只有在低延遲的情況下,才能讓通話的雙方有很強的Realtime的感覺。當然,這個主要取決於網路的速度和通話雙方的物理位置的距離,就單純軟體的角度,優化的可能性很小。
(1)迴音消除
現在大家幾乎都已經都習慣了在語音聊天時,直接用PC或筆記本的聲音外放功能。當使用外放功能時,揚聲器播放的聲音會被麥克風再次採集,傳回給對方,這樣對方就聽到了自己的迴音。
迴音消除的原理簡單地來說就是,迴音消除模組依據剛播放的音訊幀,在採集的音訊幀中做一些類似抵消的運算,從而將回聲從採集幀中清除掉。這個過程是相當複雜的,因為它還與你聊天時所處的房間的大小、以及你在房間中的位置有關,因為這些資訊決定了聲波反射的時長。 智慧的迴音消除模組,能動態調整內部引數,以最佳適應當前的環境。
(2)噪聲抑制
噪聲抑制又稱為降噪處理,是根據語音資料的特點,將屬於背景噪音的部分識別出來,並從音訊幀中過濾掉。有很多編碼器都內建了該功能。
(3)抖動緩衝區
抖動緩衝區(JitterBuffer)用於解決網路抖動的問題。所謂網路抖動,就是網路延遲一會大一會小,在這種情況下,即使傳送方是定時傳送資料包的(比如每100ms傳送一個包),而接收方的接收就無法同樣定時了,有時一個週期內一個包都接收不到,有時一個週期內接收到好幾個包。如此,導致接收方聽到的聲音就是一卡一卡的。
JitterBuffer工作於解碼器之後,語音播放之前的環節。即語音解碼完成後,將解碼幀放入JitterBuffer,音效卡的播放回調到來時,從JitterBuffer中取出最老的一幀進行播放。
JitterBuffer的緩衝深度取決於網路抖動的程度,網路抖動越大,緩衝深度越大,播放音訊的延遲就越大。所以,JitterBuffer是利用了較高的延遲來換取聲音的流暢播放的,因為相比聲音一卡一卡來說,稍大一點的延遲但更流暢的效果,其主觀體驗要更好。
當然,JitterBuffer的緩衝深度不是一直不變的,而是根據網路抖動程度的變化而動態調整的。當網路恢復到非常平穩通暢時,緩衝深度會非常小,這樣因為JitterBuffer而增加的播放延遲就可以忽略不計了。
(4)靜音檢測
在語音對話中,要是當一方沒有說話時,就不會產生流量就好了。靜音檢測就是用於這個目的的。靜音檢測通常也整合在編碼模組中。靜音檢測演算法結合前面的噪聲抑制演算法,可以識別出當前是否有語音輸入,如果沒有語音輸入,就可以編碼輸出一個特殊的的編碼幀(比如長度為0)。特別是在多人視訊會議中,通常只有一個人在發言,這種情況下,利用靜音檢測技術而節省頻寬還是非常可觀的。
(5)混音
在視訊會議中,多人同時發言時,我們需要同時播放來自於多個人的語音資料,而音效卡播放的緩衝區只有一個,所以,需要將多路語音混合成一路,這就是混音演算法要做的事情。
二.視訊通話
1.基礎模型
視訊通話的概念模型與語音完全一致:
攝像頭採集指的是從捕捉攝像頭採集到的每一幀視訊影象。在windows系統上,通常使用VFW技術或DirectShow技術來實現。採集視訊的兩個關鍵引數是幀頻(fps)和解析度。
一般而言,一個攝像頭可以支援多種不同的採集解析度和採集幀頻,而不同的攝像頭支援的解析度的集合不一樣。比如現在有很多高清攝像頭可以支援30fps的1920*1080的影象採集。
編碼用於壓縮視訊影象,同時也決定了影象的清晰度。視訊編碼常用的技術是H.263、H.264、MPEG-4、XVID等。
當對方接收到編碼的視訊幀後,會對其進行解碼,以恢復成一幀影象,然後在UI的介面上繪製出來。
2.高階功能
相比於語音,視訊的相關處理要簡單一些。
(1)動態調整視訊的清晰度
在Internet上,網路速度是實時動態變化的,所以,在視訊會議中,為了優先保證語音的通話質量,需要實時調整視訊的相關引數,其最主要的就是調整編碼的清晰度,因為清晰度越高,對頻寬要求越高,反之亦然。
比如,當檢測網路繁忙時,就自動降低編碼的清晰度,以降低對頻寬的佔用。
(2)自動丟棄視訊幀
同樣網路繁忙時,還有一個方法,就是傳送方是主動丟棄要傳送的視訊幀,這樣在接收方看來,就是幀頻fps降低了。
三.電子白板
在視訊會議中,電子白板的功能是很重要的。通常會議的主持人會在白板上畫圖進行講解,然後其它的人能同步觀看和操作電子白板的內容。
通常的電子白板都支援如下功能:線段、箭頭線、雙箭頭線,水平肘型連線符、垂直肘型連線符,矩形、三角形、橢圓(圓),文字,自由曲線,插入圖片,鐳射筆。
在實現上,電子白板主要是使用GDI+技術。
對於電子白板的同步,其原理是這樣的:比如,當操作者在白板上繪製一個影象時,這個操作會被封裝成一個Command物件(命令模式),然後,通過網路廣播發送給會議中的其它人。當其他人接收到這個Command物件時,就將其轉換成一個白板操作來執行,這樣各個白板的內容就自動同步了。
四.會議房間管理
對於那些動態建立視訊會議室,在用完之後就動態將其銷燬的通常的視訊會議應用場景來說,使用動態組來表示會議房間,是非常恰當的。
所謂“動態組”,就是在伺服器記憶體中動態建立的組,不需要序列化儲存到比如資料庫或磁碟中,需要的時候就建立一個,然後加入多個成員進行組內溝通,當不再使用的時候,就直接從記憶體中銷燬了。
基於Socket技術,我們可以在服務端實現DynamicGroupManager類來對動態組進行管理。
雖然,動態組僅僅存在於記憶體之中,但是,在專案需要時,我們仍然可以將其某些重要的資訊持久化到資料庫中儲存。然後,在伺服器重啟時,可以從DB中載入重要的房間資訊。
五.GGMeeting開源視訊會議系統下載
GGMeeting的當前版本為2.0,已經實現了上述的4個主要功能,大家可以下載原始碼研究下。
特別說明一下:
GG專案和GGMeeting專案中,只要是我寫的程式碼,全部都放出來了
廣告:如果您有類似視訊會議系統、線上培訓系統、IM系統需要定製開發的,可以聯絡我們哦:) QQ:2027224508
執行效果截圖:
部署說明:
(1)將GGMeeting.Server部署到伺服器上,並執行起來。
(2)修改Client配置檔案GGMeeting.exe.config中的ServerIP的值。
(3)執行第一個Client例項,以隨機帳號進入測試房間。
(4)在別的機器上繼續執行Client,以隨機帳號進入測試房間,大家即可在測試房間中進行視訊會議。
注意:語音視訊資料都是實時採集、實時播放的資料,所以測試時,伺服器的頻寬要求最好是獨享頻寬,共享頻寬一般無法滿足實時語音視訊的要求。
________________________________________________________________________
歡迎和我探討關於 GG 開源即時通訊系統和 GGMeeting開源視訊會議系統 的一切,我的QQ:2027224508,多多交流!
大家有什麼問題和建議,可以留言,也可以傳送email到我郵箱:[email protected]。
如果你覺得還不錯,請粉我,順便再頂一下啊
相關推薦
打造自己的視訊會議系統 GGMeeting(附送原始碼)
自從在部落格園釋出以來,結識了很多做IM的朋友,然後我和我的夥伴們也接到了很多與IM相關的專案。相比在釋出GG之前難以接到專案的狀況相比,現在簡直太幸福了,雖然做專案很辛苦,但畢竟有錢賺,那辛苦也值了。 飲水思源,這裡要感謝部落格園提供了這麼好的一個平臺,讓我們能展現自己的實力,提
C#實現視訊會議系統 GGMeeting(附原始碼)
前段時間做了個線上教育培訓的專案,與視訊會議比較類似,所以了,我打算像 廣域網即時通訊系統GG(QQ高仿版)一樣,寫一個視訊會議系統並把實現的原理和原始碼都分享出來,讓有興趣的朋友可以參考下。繼承GG的名稱,我把這個視訊會議系統命名為GGMeeting,目前版本為
【資料結構與演算法】自己動手實現圖的BFS和DFS(附完整原始碼)
圖的儲存結構 本文的重點在於圖的深度優先搜尋(DFS)和廣度優先搜尋(BFS),因此不再對圖的基本概念做過多的介紹,但是要先大致瞭解下圖的幾種常見的儲存結構。 鄰接矩陣 鄰接矩陣既可以用來儲存無向圖,也可以用來儲存有向圖。該結構實際上就是用一個二維陣列(鄰接
自動升級系統OAUS的設計與實現(續) (附最新原始碼)
private void button1_Click(object sender, EventArgs e) { int changedCount = 0; int addedCount = 0; List<FileUnit&g
自動升級系統的設計與實現(續2) -- 增加斷點續傳功能 (附最新原始碼)
一.緣起 之前已經寫了兩篇關於自動升級系統OAUS的設計與實現的文章(第一篇、第二篇),在為OAUS服務端增加自動檢測檔案變更的功能(這樣每次部署版本升級時,可以節省很多時間,而且可以避免手動修改帶來的錯誤)後,有部分使用者又提出了一個很好的建議:為OAUS增加斷點續傳功能。因為如果網路狀態不是
深入學習Tomcat----自己動手寫伺服器(附伺服器原始碼)
相信大多Web開發者對Tomcat是非常熟悉的,眾所周知Tomcat是一款非常好用的開源Servlet容器,您一定對這個最流行的Servlet容器充滿好奇,雖然它並不像一個黑盒子那樣讓人無法觸控但是Tomcat的原始碼的確讓人看起來頭疼。筆者就在這裡和大家共同分析一個簡單的W
精選機器學習&深度學習視訊資源合集 !(附下載連結)
來源:大資料探勘DT資料分析 本文長度為1400字,建議閱讀3分鐘 本文為你分享一份機器學習&深度學習視訊資源合集,一起充電吧~ 第一部分 基礎語言 pandax視訊教程連結: https://pan.baidu.com/s/1pLqavVX 密碼: fath python入門到精通
如何設計抗住100億次請求的搶紅包系統?(附GitHub程式碼)
1. 前言 前幾天,偶然看到了 《扛住100億次請求——如何做一個“有把握”的春晚紅包系統”》一文,看完以後,感慨良多,收益很
微信小程式之下拉列表實現(附完整原始碼)
目錄 一、效果圖 二、實現原理 三、原始碼 四、專案下載 同類文章推薦: 更多幹貨關注公眾號: 一、效果圖 二、實現原理 跟網頁的下拉列表實現是一樣的,剛剛開始預設下拉的內容的是不顯示的(display:none),然後通過點選的時
微信小程式之側邊欄滑動實現(附完整原始碼)
目錄 一、效果圖 二、原理解析 三、原始碼 四、專案下載 同類文章推薦: 更多幹貨關注公眾號: 一、效果圖 講什麼都不如直接上效果圖好,所以我們先來看下實現效果如何。 通過滑動螢幕,或者點選左上角的圖示按鈕,都能實現側邊欄的劃出效果。 &nb
神經網路常用啟用函式對比 sigmoid VS sofmax(附python原始碼)
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
Java實現貪吃蛇小遊戲(附完整原始碼)
今天我就從零開始來完成這個小遊戲,完成的方式也是一步一步的新增功能這樣的方式來實現。 第一步完成的功能:寫一個介面 大家見到的貪吃蛇小遊戲,介面肯定是少不了的。因此,第一步就是寫一個小介面。 實現程式碼如下: 第二步完成的功能:在介面上畫成一格一格的 我們見過的貪吃蛇遊戲
Android 二維碼 生成和識別(附Demo原始碼)
今天講一下目前移動領域很常用的技術——二維碼。現在大街小巷、各大網站都有二維碼的蹤跡,不管是IOS、Android、WP都有相關支援的軟體。之前我就想了解二維碼是如何工作,最近因為工作需要使用相關技術,所以做了初步瞭解。今天主要是講解如何使用ZXing庫,生成和識別二維碼。這篇文章實用性為主,理
在MFC中繪製地圖以及地理座標與螢幕座標轉換詳解(附工程原始碼)
在MFC中繪圖時,因為都是以畫素為單位的,所以我們只能以整數作為引數。如果我們想要把一幅地圖資料繪製在MFC視窗中,地圖的座標資料肯定的含有小數位的,這樣我們就不能直接在MFC中繪製地圖了,這就涉及到地理座標向螢幕座標的轉換。 1、地理座標轉螢幕座標 首先我們看一張圖(圖
【資料結構與演算法】Huffman樹&&Huffman編碼(附完整原始碼)
出處:http://blog.csdn.net/ns_code/article/details/19174553 Huffman Tree簡介 赫夫曼樹(Huffman Tree),又稱最優二叉樹,是一類帶權路徑長度最短的樹。假設有n個權值{w1,
【資料結構與演算法】字典樹(附完整原始碼)
字典樹簡介 字典書(Trie Tree),又稱單詞查詢樹,是鍵樹的一種,典型應用是用於統計,排序和儲存大量的字串(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻統計。 字典樹有3個基本
java專案實戰——Java打飛機小遊戲(附完整原始碼)
點選有驚喜 寫在前面 技術源於分享,所以今天抽空把自己之前用java做過的小遊戲整理貼出來給大家參考學習。java確實不適合寫桌面應用,這裡只是通過這個遊戲讓大家理解oop面向物件程式設計的過程,純屬娛樂。程式碼寫的很簡單,也很容易理解,並且註釋寫的很清楚了,還有
android 融雲 + 科大訊飛 實現仿微信語音訊息轉換為文字(附DEMO原始碼)
融雲SDK 使用很方便,簡單配置就可以搭建即時通訊功能,配合科大訊飛的語音識別, 即可實現微信中語音訊息轉換為文字的功能 融雲sdk的基本使用就不細說了, 網上很多資料 使用融雲sdk自帶的聊天會話介面,想要在此會話介面上增加語音訊息長按時彈出 “轉換為文
Android定製控制元件:帶圖示的TextView和可編輯文字框(附專案原始碼)
各位朋友,博主向大家問好啦! 初次見面,多多關照。 博主正在學習移動開發,今天老師教授的是定製控制元件:帶圖示的TextView, 然後課後依葫蘆畫瓢,博主定製了一個帶圖示的可編輯文字框,其實原理都一樣! 博主覺得該課題具有可鑑意義,特此分享給大家,幫助入門級開發人員,大蝦
利用Django實現一個部落格(附全部原始碼)
不論什麼語言,學Web開發必做的專案——個人部落格。 本次專案基於Python的知名Web框架Django,從資料庫到檢視邏輯、再到模板語法,完整的走了一遍MTV開發流程。 markdown非常適合寫部落格、新聞類文章,也快成為了開發者寫開發文件的標配了。所