打造自己的視訊會議系統 GGMeeting(附送原始碼)

C#開源即時通訊GGTalk發表於2015-05-11

      自從在部落格園釋出開源即時通訊系統GG(QQ高仿版)以來,結識了很多做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個主要功能,大家可以下載原始碼研究下。

       GGMeeting開源視訊會議系統-V2.0 原始碼

       GGMeeting開源視訊會議系統-V2.0 可直接部署版本

       特別說明一下:

       GG專案和GGMeeting專案中,只要是我寫的程式碼,全部都放出來了

   廣告:如果您有類似視訊會議系統、線上培訓系統、IM系統需要定製開發的,可以聯絡我們哦:)  QQ:2027224508 

      執行效果截圖:

       

部署說明:

(1)將GGMeeting.Server部署到伺服器上,並執行起來。

(2)修改Client配置檔案GGMeeting.exe.config中的ServerIP的值。

(3)執行第一個Client例項,以隨機帳號進入測試房間。

(4)在別的機器上繼續執行Client,以隨機帳號進入測試房間,大家即可在測試房間中進行視訊會議。

注意:語音視訊資料都是實時採集、實時播放的資料,所以測試時,伺服器的頻寬要求最好是獨享頻寬,共享頻寬一般無法滿足實時語音視訊的要求。    

________________________________________________________________________ 

歡迎和我探討關於 GG 開源即時通訊系統和 GGMeeting開源視訊會議系統 的一切,我的QQ:2027224508,多多交流!  

大家有什麼問題和建議,可以留言,也可以傳送email到我郵箱:2027224508@qq.com。  

如果你覺得還不錯,請粉我,順便再頂一下啊

 

相關文章