C#實現視頻會議系統 GGMeeting(附源碼)

來源:互聯網
上載者:User

標籤:視頻會議   源碼   c#   即時通訊   

      前段時間做了個線上教育培訓的項目,與視頻會議比較類似,所以了,我打算像 廣域網路即時通訊系統GG(QQ高仿版)一樣,寫一個視頻會議系統並把實現的原理和源碼都分享出來,讓有興趣的朋友可以參考下。繼承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的目前的版本為1.0,已經實現了上述的4個主要功能,大家可以下載源碼研究下。

       GGMeeting-V1.0 源碼

       GGMeeting-V1.0 可直接部署版本        

       運行效果:

       

部署說明:

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

(2)修改Client設定檔GGMeeting.exe.config中的ServerIP的值。

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

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

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

________________________________________________________________________ 

歡迎和我探討關於 GG 和 GGMeeting 的一切,我的QQ:2027224508,多多交流!  

大家有什麼問題和建議,可以留言,也可以發送email到我郵箱:[email protected]。  

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

C#實現視頻會議系統 GGMeeting(附源碼)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.