1. 程式人生 > >C#實現視訊會議系統 GGMeeting(附原始碼)

C#實現視訊會議系統 GGMeeting(附原始碼)

      前段時間做了個線上教育培訓的專案,與視訊會議比較類似,所以了,我打算像 廣域網即時通訊系統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個主要功能,大家可以下載原始碼研究下。

       執行效果截圖:

      

部署說明:

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

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

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

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

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

________________________________________________________________________ 

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

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

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

相關推薦

C#實現視訊會議系統 GGMeeting原始碼

      前段時間做了個線上教育培訓的專案,與視訊會議比較類似,所以了,我打算像 廣域網即時通訊系統GG(QQ高仿版)一樣,寫一個視訊會議系統並把實現的原理和原始碼都分享出來,讓有興趣的朋友可以參考下。繼承GG的名稱,我把這個視訊會議系統命名為GGMeeting,目前版本為

打造自己的視訊會議系統 GGMeeting原始碼

      自從在部落格園釋出以來,結識了很多做IM的朋友,然後我和我的夥伴們也接到了很多與IM相關的專案。相比在釋出GG之前難以接到專案的狀況相比,現在簡直太幸福了,雖然做專案很辛苦,但畢竟有錢賺,那辛苦也值了。        飲水思源,這裡要感謝部落格園提供了這麼好的一個平臺,讓我們能展現自己的實力,提

webuploader結合SpringMVC實現多圖片上傳原始碼

本案例實現多圖片上傳並且可以在前端預覽圖片,後端使用SpringMVC框架接收檔案,文章最後附原始碼。 一、效果 ![這裡寫圖片描述](https://img-blog.csdn.net/2018082816114114?watermark/2/text/aH

Linux下基於UDP協議實現的聊天室專案原始碼

好久沒來更新了,這段時間一直在著手完成這個專案,由於之前沒有接觸過這種稍大型的專案,而且對於C/S架構以及UDP通訊的瞭解也不是很深,所以前面很大的一段時間都被浪費掉了,做了很大無用功。 剛開始弄的時候,也是在網上搜了很多資料,找了很多版本,發現大都有

使用Qt5+CMake實現圖片的區域選擇原始碼

近期研發涉及到了圖片的區域選擇,找來一些資料一直不能很滿意,所以自己實現了一個。 實現步驟如下。原始碼可以點選ImageAOI獲取。 如下資料來自原始碼的README。 ImageAOI (XLabel): AOI Selection Based on Qt5 Dependency Qt >= 5.0

如何實現監控手機螢幕?原始碼

  最近做了一個專案,裡面有涉及到監控PC桌面和監視手機螢幕的功能,客戶需要在PC電腦上和安卓手機上都能夠觀看對方的螢幕,而對方的裝置既可以是PC電腦,也可以是安卓手機。        為了便於以後複習,我把這個螢幕監控的功能單獨提出來做了個Demo名為ScreenMo

急急如律令!火速搭建一個C#即時通訊系統原始碼分享——高度可移植!

1 void tcpPassiveEngine_MessageReceived(IPEndPoint userAddress, byte[] msg) 2 { 3 //取出訊息型別 4 int msgType = BitCon

【分享】分享一個基於SSH實現的簡單學生選課系統原始碼

歡迎關注微信賬號:java那些事:csh624366188.每天一篇java相關的文章 java交流工作群1: 77800592(已滿) java交流學生群2:234897635(已滿) java交流工作群3:94507287 java交流工作群4: 272265434 我的郵箱:

原理和C++實現的演示程式原始碼

http://blog.csdn.net/mahabharata_/article/details/71856907    大二的時候,曾受老師所託,用C++而不是OpenGL去寫B樣條曲線的教學程式。時隔一年,發現原始碼找不見了,所以重新寫了一遍,也完善了部分功能,順

mysql 使用 limit 實現底層分頁原始碼

原理解析: <select id="queryProductList" resultType="com.pojo.Product"> SELECT * FROM tb_product ORDER BY priority DESC LIMIT #{rowIndex},#{p

CVPR論文《100+ Times FasterWeighted Median Filter (WMF)》的實現和解析(附原始碼)。 任意半徑中值濾波擴充套件至百分比濾波器O(1)時間複雜度演算法的原理、實現及效果 任意半徑中值濾波擴充套件至百分比濾波器O(1)時間複雜度演算法的原理、實現

  四年前第一次看到《100+ Times FasterWeighted Median Filter (WMF)》一文時,因為他附帶了原始碼,而且還是CVPR論文,因此,當時也對程式碼進行了一定的整理和解讀,但是當時覺得這個演算法雖然對原始速度有不少的提高,但是還是比較慢。因此,沒有怎麼在意,這幾天有幾位朋友

安卓識別身份證,自動提取身份證資訊功能實現原始碼

原始碼下載地址:注:原始碼裡沒有騰訊優圖的賬號需要填寫自己的 下載地址 先講幾下.首先我們需要去騰訊優圖申請一個賬號,因為身份證識別需要用到第三方介面如圖所示 我申請的是掃描身份證,當然還有其他的功能,比如掃描銀行卡,營業執照,車牌等等  ,大家可以去研究一下

python實現Excel檔案讀取的程式原始碼

python實現Excel檔案讀取的程式   前一段時間幫一個朋友用python寫了一個讀Excel程式操作的程式,具體要求為:讀取兩個Excel檔案,根據其中某個特徵的特徵值對這兩個檔案進行取交集操作,生成三個Excel檔案,第一個Excel檔案為這兩個檔案的公

C#設計模式02-抽象工廠模式原始碼

        抽象工廠模式是所有工廠模式中最為抽象的模式,是抽象程度最高的模式,也是最難理解的一種工廠模式。         現在舉一個生活中的案例來

Promise實現原理原始碼

本篇文章主要在於探究 Promise 的實現原理,帶領大家一步一步實現一個 Promise , 不對其用法做說明,如果讀者還對Promise的用法不瞭解,可以檢視阮一峰老師的ES6 Promise教程。 接下來,帶你一步一步實現一個 Promise 1. Promise 基本結

高併發、低延遲之C#玩轉CPU快取記憶體示例

寫在前面 好久沒有寫部落格了,一直在不斷地探索響應式DDD,又get到了很多新知識,解惑了很多老問題,最近讀了Martin Fowler大師一篇非常精彩的部落格The LMAX Architecture,裡面有一個術語Mechanical Sympathy,姑且翻譯成軟硬體協同程式設計(Hardware an

SSD目標檢測(1):圖片+視訊內的物體定位原始碼

一、SSD用於圖片物體的定位與檢測 SSD原理介紹這一篇部落格對我的幫助比較大,很詳細的介紹了SSD原理,送給大家做了解 1、下載SSD框架原始碼 1.1

.NET高效能程式設計之C#玩轉CPU快取記憶體示例

寫在前面 好久沒有寫部落格了,一直在不斷地探索響應式DDD,又get到了很多新知識,解惑了很多老問題,最近讀了Martin Fowler大師一篇非常精彩的部落格The LMAX Architecture,裡面有一個術語Mechanical Sympathy,姑且翻譯成軟硬體協同程式設計(Hardware a

js實現移動端省市區三級聯動選擇器原始碼

效果圖:  核心程式碼: <script> var nameEl = document.getElementById('sel_city'); var first = []; /* 省,直轄市 */ var second = []

CVPR論文《100+ Times FasterWeighted Median Filter (WMF)》的實現和解析原始碼

      四年前第一次看到《100+ Times FasterWeighted Median Filter (WMF)》一文時,因為他附帶了原始碼,而且還是CVPR論文,因此,當時也對程式碼進行了一定的整理和解讀,但是當時覺得這個演算法雖然對原始速度有不少的提高,但是還是比較慢。因此,沒有怎麼在意,這幾天有