




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、畢畢 業業 設設 計計( 論論 文文)基于局域網的視頻聊天室系統的設計與實現基于局域網的視頻聊天室系統的設計與實現論論文作者姓名:文作者姓名:申申請請學位學位專業專業: :申申請請學位學位類別類別: :指指導導教教師師姓姓名名( (職職稱稱) ): :論論文提交日期:文提交日期:基于局域網的視頻聊天室系統的設計與實現基于局域網的視頻聊天室系統的設計與實現摘摘 要要視頻聊天系統作為一種新型的通信和交流工具,突破了地域的限制,可以提供更為便捷、靈活、全面的音、視頻信息的傳遞和服務,具有極其廣泛的發展前景。本文介紹了采用 Microsoft Visual C+ 6.0 編程開發視頻聊天系統的一套比較
2、常用的解決方案。文字聊天采用 TCP 模式;語音視頻聊天采用 UDP 模式,在客戶端之間點對點的進行。在該方案中,通過函數庫 VFW 來實現視頻捕獲、影像壓縮以及影像播放。微軟公司提供的專門用于視頻捕獲開發的工具包VFW,為在 Windows 操作系統中實現視頻捕獲提供了標準的接口,從而大大降低了程序的開發難度。在視頻傳輸方面,則通過組建視頻幀,將位圖形式的視頻幀壓縮成幀格式的 Mpeg4 流,傳輸到客戶端后,解壓并顯示影像。同時,在本方案中,采用了線程來實現語音錄制和語音回放,最終實現了通過服務器中轉的文字聊天、點對點的語音視頻聊天。關鍵詞關鍵詞:文字聊天;VFW;視頻捕獲;視頻傳輸;語音錄
3、制;語音回放The Design and Realization of LAN-Based Video Chat Room SystemAbstractAs a new tool about communication, video chatting system has broken through geographical restrictions, has provides more convenient, flexible and complete transmission and service. Furthermore, it has a very bright future.Th
4、e common solution about how to develop a video chatting system is introduced by the Microsoft Visual C + + 6.0 programming. TCP model is used in the text chatting and UDP for the point-to-point video chats between the Clients. In this plan, Video Capture, Video Compression Manager and DrawDib are re
5、alized by the functions of VFW Library. The special kit VFW (Video for Windows) in video capture offered by Microsoft Corporation, has provided a standard interface for video capture in Windows Operating System and thus greatly reduced the hardship of programming. In video transmission aspect, it re
6、quires a video frame which is compressed the video frame of bitmap into Mpeg4 steam of frame form. Then it will be decompressed into images since it has been arrived the Client. Meanwhile, the thread is used to achieve audio recording and replaying. Finally, it has realized the text chatting through
7、 a server to transit, the point-to-point audio and video chats.Key words: text chatting; VFW; Video Capture; video transmission; audio recording; audio playing目目 錄錄論文總頁數:24 頁1引言.11.1課題背景.11.2國內外研究現狀.12理論知識介紹.12.1VFW 簡介.12.2線程的實現方法.43需求分析.53.1軟硬件環境.53.2需求分析.54系統結構.74.1硬件結構.74.2軟件結構.74.2.1功能需求.74.2.2系
8、統功能模塊圖.84.3系統各模塊流程圖.85系統的詳細設計.105.1文字聊天.105.1.1TCP 套接字的運用.105.1.2文字聊天實現.115.2語音視頻聊天.135.2.1UDP 套接字的運用.135.2.2視頻的捕獲.145.2.3捕獲窗口.165.2.4視頻捕獲驅動.185.2.5語音錄制.185.2.6語音回放.195.2.7視音頻的傳輸.20結 論.21參考文獻.22致 謝.23聲 明.24第 1 頁 共 24 頁1 1 引言引言1.11.1 課題背景課題背景隨著 Internet 的不斷發展普及,網絡通訊越來越被千家萬戶所接受,成為人們生活中的一部分。網絡聊天已和手機等一樣
9、,成為人們運用最為廣泛的通信工具之一。本畢業設計的目的主要是為了滿足人們通訊交流的便捷,實現靈活、全面的音、視頻信息的傳遞和服務。模擬騰訊公司的 QQ 聊天軟件,開發一個多功能的聊天系統軟件,本畢業設計主要實現視頻語音聊天、文字聊天等功能。1.21.2 國內外研究現狀國內外研究現狀隨著網絡寬帶業務的推廣與普及,加之視頻產品設備(如攝像頭、耳機、麥克風等)的成熟,普通用戶可以輕松地借助網絡視頻通訊軟件,實現“面對面”的網絡交流。信息的無限量擴大,交通工具的便捷,視頻技術的充分應用等導致了行業間競爭的全球化,這就要求現代部門、企業要具備更加靈敏的神經,更扁平化的管理,更快速的反應和決策,更貼切的市
10、場宣傳和服務。所有這一切是由信息技術的發展所帶來的,同樣也要求有先進的信息技術來提高部門、企業的競爭力。現代通訊已經是越來越普及了,必須有效合理的運用視頻產品類設備來提高信息的傳遞和交流。在同一個局域網中,充分、合理的運用攝像頭、耳機、麥克風等設備來實現文字聊天和語音視頻聊天更是我們生活、學習、工作的便利所在。2 2 理論知識介紹理論知識介紹2.12.1 VFWVFW 簡介簡介VFW 是 Microsoft 1992 年推出的關于數字視頻的一個軟件包,它能使應用程序數字化并播放從傳統模擬視頻源得到的視頻剪輯。VFW 的一個關鍵思想是播放時不需要專用硬件,為了解決數字視頻數據量大的問題,需要對數
11、據進行壓縮。它引進了一種叫 AVI 的文件標準,該標準未規定如何對視頻進行捕獲、壓縮及播放,僅規定視頻和音頻該如何存儲在硬盤上,以及在 AVI 文件中交替存儲視頻幀和與之相匹配的音頻數據。VFW 給程序員提供 VBX 和 AVICap 窗口類的高級編程工具,使程序員能通過發送消息或設置屬性來捕獲、播放和編輯視頻剪輯。用戶不必專門安裝 VFW,在安裝 Windows 時,安裝程序會自動地安裝配置視頻所需的組件,如設備驅動程序、視頻壓縮程序等。VFW 主要由以下六個模塊組成:(1) AVICAP.DLL:包含了執行視頻捕獲的函數,它給 AVI 文件、I/O 和視頻音頻設備驅動程序提供一個高級接口;
12、(2) MSVIDEO.DLL:用一套特殊的 DrawDib 函數來處理屏幕上的視頻操第 2 頁 共 24 頁作;(3) MCIAVI.DRV:此驅動程序包括對 VFW 的 MCI 命令的解釋器;(4) AVIFILE.DLL:支持由標準多媒體 I/O(mmio)函數提供的更高的命令來訪問 AVI 文件;(5) 壓縮管理器(ICM):管理用于視頻壓縮/解壓縮的編解碼器(CODEC) ;(6) 音頻壓縮管理器 ACM:提供與 ICM 相似的服務,不同的是它適于波形音頻。Visual C+在支持 VFW 方面提供有 vfw32.lib、msacm32.lib、winmm.lib等庫。特別是它提供了
13、功能強大、簡單易行、類似于 MCIWnd 的窗口類AVICap。AVICap 為應用程序提供了一個簡單的、基于消息的接口,使之能訪問視頻和波形音頻硬件,并能在將視頻流捕獲到硬盤上的過程中進行控制。AVICap 支持實時的視頻流捕獲和單幀捕獲,并提供對視頻源的控制。雖然MCI 也提供數字視頻服務,比如,它為顯示 AVI 文件的視頻提供了 AVIVideo 命令集,為視頻疊加提供了 overlay 命令集,但這些命令主要是基于文件的操作,不能滿足實時地直接從視頻緩存中獲取數據的要求。對于使用沒有視頻疊加能力的捕獲卡的 PC 機來說,用 MCI 提供的命令集是無法捕獲視頻流的。而AVICap 在捕獲
14、視頻方面具有一定的優勢,它能直接訪問視頻緩沖區,不需要生成中間文件,實時性很強,效率很高。同時,它也可將數字視頻捕獲到文件。在視頻捕獲之前需要創建一個捕獲窗,所有的捕獲操作及其設置都以它為基礎。用 AVICap 窗口類創建的窗口(通過 capCreateCaptureWindow 函數創建)被稱為“捕獲窗” ,其窗口風格一般為 WS_CHILD 和 WS_VISIBLE。實際上,捕獲窗類似于標準控制(如按鈕、列表框等) 。捕獲窗具有下列功能:(1) 將視頻流和音頻流捕獲到一個 AVI 文件中;(2) 動態地同視頻和音頻輸入器件連接或斷開;(3) 以 Overlay 或 Preview 模式對輸
15、入的視頻流進行實時顯示;(4) 在捕獲時可指定所用的文件名并能將捕獲文件的內容拷貝到另一個文件;(5) 設置捕獲速率;(6) 顯示控制視頻源、視頻格式、視頻壓縮的對話框;(7) 創建、保存或載入調色板;(8) 將圖像和相關的調色板拷貝到剪貼板;(9) 將捕獲的一個單幀圖像保存為 DIB 格式的文件。AVICap 在顯示視頻時提供的兩種模式:第 3 頁 共 24 頁(A)預覽(Preview)模式:該模式使用 CPU 資源,視頻幀先從捕獲硬件傳到系統內存,接著采用 GDI 函數在捕獲窗中顯示。在物理上,這種模式需要通過 VGA 卡在監視器上顯示。(B)疊加(Overlay)模式:該模式使用硬件疊
16、加進行視頻顯示,疊加視頻的顯示不經過 VGA 卡,疊加視頻的硬件將 VGA 的輸出信號與其自身的輸出信號合并,形成組合信號顯示在計算機的監視器上。只有部分視頻捕獲卡才具有視頻疊加能力。靈活編寫 AVICap 提供的回調函數還可滿足一些特殊需求。比如,將宏capCaptureSequenceNoFile 同用 capSetCallbackOnVideoStream 登記的回調函數一起使用,可使應用程序直接使用視頻和音頻數據。在視頻聊天的應用程序中可利用這一點來獲得視頻幀,回調函數將捕獲的圖像傳到遠端的計算機。應用程序可用捕獲窗來登記回調函數(由用戶編寫,而由系統調用) ,以便在發生下列情況時,它
17、能通知應用程序,作出相應的反應:捕獲窗狀態改變;出錯;視頻幀和音頻緩存可以使用;在捕獲過程中,其它應用程序處于讓步(Yield)地位。視頻捕獲編程也要用到涉及視頻捕獲的結構、宏、消息和函數。令人高興的是,發送 AVICap 窗口消息所能完成的功能都能調用相應的宏來完成。例如,SendMessage(hWndCap,WM_CAP_DRIVER_CONNECT,0,0L)與capDriverConnect(hWndCap,0)的作用相同,都是將創建的捕獲窗同視頻輸入器件連接起來。視頻部分主要是利用 Video Capture 函數庫來獲取影像的。Video Capture主要提供下列功能:連接驅動
18、程序;獲取影像、聲音資料,并顯示在屏幕上或者是存成 AVI 文件;獲取單張影像顯示在屏幕上,拷貝至剪貼簿,或者是存成DIB(Device-Independent Bitmap)文件。Video Capture 的主要結構:結構體 CAPTUREPARAMS 主要包含一些獲取圖像的參數:DWORD dwRequestMicroSecPerFrame 代表相鄰兩個 frame 的獲取時間間隔;BOOL fYield 值為 TRUE,則表示 Windows 會以另一個 thread 來捕獲影像,值為FALSE,程序會在捕捉影像后顯示忙碌狀態;BOOL fCaptureAudio 其值表示是否需要同時
19、獲取聲音資料。結構體 BITMAPINFO 和點陣圖有關,主要定義了影像獲取之后顯示在屏幕上、存儲在文件中的格式,它包含兩個成員:BITMAPINFOHEADER bmiHeader 描述影像性質的結構,其成員記載了影像的大小、顏色深度和壓縮的方式,該成員在Video Capture、Video Compression Manager 和 DrawDib 函數庫中,以及有關第 4 頁 共 24 頁于點陣圖的應用中;RGBQUAD bmiColors 指向 color table 第一個元素的位置。結構體 COMPVARS 主要是記錄所有和壓縮相關的信息,重要的成員:DWORD fccHandl
20、er 為 compressor 句柄;LPBITMAPINFO lpbiIn 指向待壓縮影像BITMAPINFO 的指標;LPBITMAPINFO lpbitOut:指向壓縮完影像 BITMAPINFO 的指標;LONG lKey 代表 key-frame rate,而所謂 key frame 是指此 frame 在解壓縮時不需要依賴前面的 frame;LONG lQ 代表影像壓縮后的品質,取值為110000 的整數。Video Compression Functions 主要記錄壓縮功能相關的信息,其包含的比較重要的成員:ICLocate 輸入指向壓縮前后 BITMAPINFO 的指標,以及
21、欲使用的 codecs;ICCompressorChoose 呼叫一個系統內建的對話,其中包含所有可能使用的 codes 以及其相關參數;ICCompressQuery 詢問 compressor 是否支持某種壓縮方式,輸入參數為 compressor handle 及指向壓縮前后 BITMAPINFO 的指標,此函數會傳回詢問結果;ICCompressBegin 要求系統準備相關資源以供壓縮之用;ICCompress 壓縮某個 frame;ICCompressEnd 歸還相關資源給系統;ICDompressQuery 詢問 decompressor 是否支持某種解壓縮方式;ICDompres
22、sBegin 要求系統準備相關資源以供解壓縮之用;ICDompress 解壓縮某一個 frame;ICDompressEnd 歸還相關資源給系統;ICDompressFree 歸還COMPVARS 所占用的資源。2.22.2 線程的實現方法線程的實現方法線程是一個獨立的執行流,是進程內部的一個獨立的執行單元,相當于一個子程序,它對應于 Visual C+中的 CWinThread 類對象。單獨一個執行程序運行時,缺省地包含了一個主線程,主線程以函數地址的形式出現,提供程序的啟動點,當主線程終止時,進程也隨之終止。根據實際需要,應用程序可以分解成許多獨立執行的線程,每個線程并行的運行在同一進程中
23、。一個進程中的所有線程都在該進程的虛擬地址空間中,使用該進程的全局變量和系統資源。操作系統給每個線程分配不同的 CPU 時間片,在某一個時刻,CPU 只執行一個時間片內的線程,多個時間片中的相應線程在 CPU 內輪流執行,由于每個時間片時間很短,所以對用戶來說,仿佛各個線程在計算機中是并行處理的。操作系統是根據線程的優先級來安排 CPU 的時間,優先級高的線程優先運行,優先級低的線程則繼續等待。Windows 提供了兩種線程:用戶界面線程和工作線程(又稱為后臺線程) 。用戶界面線程通常用來處理用戶的輸入并響應各種事件和消息,其實,應用程序的主執行線程 CWinApp 對象就是一個用戶界面線程,
24、當應用程序啟動時自動第 5 頁 共 24 頁創建和啟動,同樣它的終止也意味著該程序的結束,進程終止。工作線程用來執行程序的后臺處理任務,比如計算、調度、對串口的讀寫操作等,它和用戶界面線程的區別是它不用從 CWinThread 類派生來創建,對它來說最重要的是如何實現工作線程任務的運行控制函數。工作線程和用戶界面線程啟動時要調用同一個函數的不同版本;一個進程中的所有線程共享它們父進程的變量,但同時每個線程可以擁有自己的變量。這里主要介紹用戶界面線程的運用:(1) 線程的啟動創建一個用戶界面線程,首先要從類 CwinThread 產生一個派生類,同時必須使 DECLARE_DYNCREATE 和
25、 IMPLEMENT_DYNCREATE 來聲明和實現這個CwinThread 派生類。第二步是根據需要重載該派生類的一些成員函數如:ExitInstance() 、InitInstance() 、OnIdle() 、PreTranslateMessage()等函數。最后調用 AfxBeginThread()函數的一個版本:CWinThread* AfxBeginThread (CRuntimeClass* pThreadClass,int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags
26、= 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL)啟動該用戶界面線程,其中第一個參數為指向定義的用戶界面線程類指針變量,第二個參數為線程的優先級,第三個參數為線程所對應的堆棧大小,第四個參數為線程創建時的附加標志,缺省為正常狀態,如為 CREATE_SUSPENDED 則線程啟動后為掛起狀態。(2) 線程的優先級CwinThread 類的成員函數用于線程優先級的操作:int GetThreadPriority() ;BOOL SetThradPriority()(int nPriority);(3) 線程的掛起和恢復CWinThread 類中包
27、含了應用程序掛起和恢復它所創建的線程的函數,其中SuspendThread()用來掛起線程,暫停線程的執行;ResumeThread()用來恢復線程的執行。如果你對一個線程連續若干次執行 SuspendThread() ,則需要連續執行相應次的 ResumeThread()來恢復線程的運行。(4) 結束線程終止線程有三種途徑,線程可以在自身內部調用 AfxEndThread()來終止自身的運行;可以在線程的外部調用 BOOL TerminateThread(HANDLE hThread, DWORD dwExitCode)來強行終止一個線程的運行,然后調用 CloseHandle()函數釋放線
28、程所占用的堆棧;第三種方法是改變全局變量,使線程的執行函數返回,則該線程終止。第 6 頁 共 24 頁3 3 需求分析需求分析3.13.1 軟硬件環境軟硬件環境電腦兩臺以上,分別配有攝像頭、麥克風、音箱或耳機等外部設備;Windows XP 系統,Microsoft Visual Studio 6.0 編程開發系統等。3.23.2 需求分析需求分析在同一個局域網中,如何根據自身業務的要求,量身定制,對視頻設備進行合理搭配,選擇一套合理的視頻聊天室系統。如何來滿足局域網內部用戶的通訊要求,在考慮到網絡帶寬的同時,提高視頻清晰度,動態畫面的流暢,語音的實時傳輸等,正是現代社會通訊所必需的。設計本系
29、統時,分析網絡承載、整個系統結構的組建等是實現局域網文字聊天和語音視頻聊天所必需的。文字、語音視頻聊天作為一種廣泛的網絡應用對其基礎的承載網絡環境有著較高的網絡要求。其中應重點考慮的是網絡的帶寬情況、端到端的時延、時延抖動、丟包率等問題。(1)網絡帶寬需求,視頻聊天對網絡的帶寬需求為“視頻帶寬+IP 包頭開銷” ,計算方法為:網絡帶寬 = 視頻帶寬 1.2。(2)端到端的時延,網絡傳輸不可避免的會發生傳輸時延,通常建議視頻聊天的通用時延小于 150ms。(3)時延抖動,由于音頻/視頻的傳輸為實時的交互,因此網絡的時延抖動更為重要,一般,視頻聊天的時延抖動控制在 50ms 內。(4)丟包率,網絡
30、數據傳輸經常會出現丟包現象,視頻傳輸過程中數據丟包嚴重的話會影響在線視頻聊天質量。因此,在設計上應將網絡上的丟包率控制在 1%以內。視頻聊天對實時性要求較高的網絡應用,作為其基礎的承載網絡有較高的寬帶和對網絡中的業務流量有較高的控制能力。而視頻聊天系統本身對帶寬的要求為 62kbit/s2Mbit/s,但是為了滿足流暢的視音頻效果,要求帶寬不低于384kbit/s。文字、視頻聊天的功能和應用效果體現在客戶端,而服務器端則是必不可少的,對于系統的需求分析在系統設計的過程中應該明確、細致:(1) 文字聊天:首先啟動服務器端,當用戶啟動客戶端時,用服務器保存的用戶名和密碼來驗證客戶是否已經登錄到服務
31、器。只有當有兩個以上的用戶啟動客戶端時,才可以進行文字聊天,聊天內容要經過服務器中轉,分別在服務器端和兩個聊天的客戶端顯示聊天。(2) 語音視頻聊天:在有兩個客戶在線的情況下,才能進行語音視頻聊天。兩個用戶要進行語音視頻聊天時,一個用戶選中另一個用戶的用戶名,根第 7 頁 共 24 頁據該用戶名在后臺鏈表中的對應 IP 地址查找用戶并請求視頻連接。當雙方確認視頻連接后就進行視頻傳輸,并顯示在客戶端,同時用線程實現語音錄制和回放。這樣,兩個用戶就實現了點對點的語音視頻聊天。在進行語音視頻聊天的過程中,不能再與其它用戶進行語音視頻聊天,但能夠與其它用戶進行文字聊天。4 4 系統結構系統結構4.14
32、.1 硬件結構硬件結構該系統采用的是 Server/Client 結構,服務器端是一臺 PC 機,而客戶端是PC 機和一個數字攝像頭、耳機和麥克風。它們進行文字聊天時,要經過服務器進行中轉,而當進行語音視頻聊天時是客戶端與客戶端之間直接進行的點對點的連接,它們之間的網絡拓撲結構如圖 1。在圖中,為了簡便,沒有畫出麥克風、音箱或耳機等外部設備。圖 1 網絡拓撲結構圖4.24.2 軟件結構軟件結構4.2.14.2.1 功能需求功能需求通過需求調研并分析,確定系統具備的基本功能,包括:文字聊天、語音視頻聊天。(1) 文字聊天:文字聊天采用的是 TCP 模式,包括服務器端和客戶端。首先啟動服務器端,客
33、戶端通過用戶名和密碼登錄服務器,服務器響應客戶端登錄并提示有用戶登錄,此時兩個用戶就可以進行文字聊天,在文字聊天時通過服務器中轉,而每個用戶可以同時與多個用戶進行文字聊天。當有用戶退出時,服務器做出響應,提示在線用戶,用戶下線。第 8 頁 共 24 頁(2) 語音視頻聊天:語音視頻聊天時采用的是 UCP 模式,客戶端與客戶端點對點的進行,不需要經過服務器端中轉。在文字聊天的基礎上,客戶端之間自行處理的語音視頻聊天,運用 VFW 函數庫中的函數對 USB 口輸入的數字視頻信息進行相關處理,比如:視頻捕獲、影像壓縮以及影像播放等,同時利用線程來處理聲音部分的錄制、回放等。A 客戶端向 B 客戶端請
34、求語音視頻聊天是通過 B 客戶端的用戶名來獲得 B 客戶端的 IP 地址,并向 B 客戶端發送語音視頻聊天請求,當 B 客戶端接受后捕獲視頻,并進行壓縮傳輸到 A 客戶端解壓并進行顯示,在 B 客戶端接受視頻的同時,A 客戶端也捕獲視頻,壓縮傳輸到 B 客戶端解壓并進行顯示。4.2.24.2.2 系統功能模塊圖系統功能模塊圖該系統分為服務器端和客戶端,完成了文字聊天和語音視頻聊天,使用上只有文字聊天時才會通過服務器端,而對于語音視頻聊天就只需要對整個在線客戶端兩兩之間進行點對點的視頻聊天。而在語音視頻時包括了視頻捕獲、視頻壓縮、解壓縮、語音錄制、語音回放以及視頻傳輸等。整個系統的功能模塊圖如圖
35、 2。基基于于局局域域網網的的視視頻頻聊聊天天室室系系統統語語音音視視頻頻聊聊天天視視頻頻捕捕獲獲視視頻頻壓壓縮縮、解解壓壓縮縮視視頻頻傳傳輸輸服服務務器器中中轉轉語語音音錄錄制制語語音音回回放放文文字字聊聊天天圖 2 系統功能模塊圖4.34.3 系統各模塊流程圖系統各模塊流程圖在整個系統中主要運行兩個功能:圖 3 文字聊天流程圖和圖 4 語音視頻聊天流程圖。第 9 頁 共 24 頁圖 3 文字聊天流程圖圖 4 語音視頻聊天流程圖第 10 頁 共 24 頁5 5 系統的詳細設計系統的詳細設計5.15.1 文字聊天文字聊天5.1.15.1.1 TCPTCP 套接字的運用套接字的運用在文字聊天時,
36、服務器端與客戶端的連接是采用的 TCP 套接節進行連接。TCP 套接字的使用如圖 5。創建 CSocket 對象 CSocketServer 來處理服務器端與客戶端的連接,CSocket 繼承于 CasyncSocket,是 Windows Socket API 的高層抽象。CSocket 通常和 CsocketFile 以及 Carchive 類混合使用,這兩個類負責數據的發送和接收。要使用 CSocket 對象,首先要調用構造函數,然后調用Create 函數創建一個 Socket 句柄。CSocket 函數缺省是創建一個流 Socket;如果沒有使用 CArchive 類,那么還可以創建一
37、個數據報 Socket。服務器端調用 Accept,客戶端調用 Connect,然后創建一個 CsocketFile 去關聯CSocket。接下來的操作可以創建 CArchive 對象關聯 CsocketFile,以用來發送和接收數據。第 11 頁 共 24 頁圖 5 TCP 套接字的使用5.1.25.1.2 文字聊天實現文字聊天實現ChatServer 服務器運行時,利用一個 CSocket 對象 CSocketServer 啟動服務器,用函數 gethostname 來獲得服務器端主機名和 IP,同時在服務器對話框中顯示服務器 IP,并將分配的固定端口號 8123 顯示在對話框中。用一個
38、list列表顯示在線用戶,隨時更新用戶登錄情況,用一個 edit box 顯示客戶端的聊天內容以及系統提示消息。每一個 ChatClient 客戶端啟動時,利用服務器內定的用戶號和密碼來登錄(如圖 6)。在整個系統中,利用鏈表來處理所有的用戶信息:當有用戶登錄時,在鏈表尾部加入該用戶信息;當用戶下線時,在該鏈表中刪除用戶,并提示所有用戶,該用戶下線。在對鏈表進行操作的同時,要更新 list 列表中的信息。圖 6 用戶登錄界面ChatServer 服務器端響應客戶端文字聊天時的中轉情況如圖 7。圖 7 服務器響應文字聊天信息中轉第 12 頁 共 24 頁ChatClient 客戶端兩兩間進行文字
39、聊天時,發送信息的處理函數如下:void CChatClientDlg:OnChatBtSend() /發送信息按鍵if( !m_bConnect)SetMessageBox(請連接服務器!rn);return ;CString str;CString szUserName;CMesg msg;GetDlgItemText(IDC_MESSAGE,str);GetDlgItemText(IDC_USERNAME,szUserName);if( str.GetLength() = 0 )SetMessageBox(請輸入想要發送的信息!rn);return ;if ( szUserName.Ge
40、tLength() SendM(&msg);AddReceiver(szUserName , true);AddChatMessage(str);在聊天兩個客戶端的信息情況如圖 8 和圖 9。第 13 頁 共 24 頁圖 8 接收文字信息圖 9 發送文字信息5.25.2 語音視頻聊天語音視頻聊天5.2.15.2.1 UDPUDP 套接字的運用套接字的運用在實現語音視頻聊天時,采用的是基于 UDP 套接字的點對點模式,而 UDP 面向的是無連接的數據服務,其套接字的使用如圖 10 所示。第 14 頁 共 24 頁圖 10 UDP 套接字的使用5.2.25.2.2 視頻的捕獲視頻的捕獲利用
41、 VFW 接口,視頻捕獲可以分為以下幾個步驟:(1) 建立視頻采集窗口:該窗口用來接收視頻捕捉驅動程序傳來的數據和消息。(2) 連接視頻驅動程序:將建立的視頻捕捉窗口與視頻設備驅動程序相連。(3) 視頻捕獲初始化。(4) 視頻捕捉設置:VFW 下視頻捕捉參數的設置可以通過調用函數或彈出對話框的形式來實現。一般視頻驅動程序允許設置的參數包括視頻源選擇、視頻格式、視頻顯示格式等。(5) 設置回調函數:通過回調函數來通知程序視頻事件的發生,比如捕捉一幀圖像成功的消息,捕捉出錯的消息等。(6) 結束捕捉:結束捕捉是應該有一些清除工作。如釋放分配的內存,斷開捕捉窗口與視頻捕捉驅動程序的連接,清除視頻捕捉
42、窗口等。窗口類為捕獲數字視頻流及其相關操作提供了很大的方便,靈活編寫其中第 15 頁 共 24 頁的回調函數可滿足實時視頻傳輸的需要,例如應用程序可直接從緩沖中取得數字視頻并對其進行壓縮編碼后實時地傳到遠端的客戶端。在 VC+中,采用 VFW 技術,客戶端通過 capSetCallbackOnFrame()注冊回調函數,當采集卡采集到一幅圖像后,系統就會自動調用回調函數,然后再回調函數中使用 ICSeqCompressFrame()函數進行壓縮。然后再通過 Winsock 將壓縮后的數據發送到另一客戶端。該客戶端接收完一幀以后,交給ICDecompress()解壓,最后用 SetDIBitsT
43、oDevice()將圖像顯示出來。基本的捕獲設置包括設置捕獲速度(每秒捕獲多少幀) 、是否同時捕獲聲頻、捕獲緩沖、允許最大丟失多少幀和是否使用 DOS 內存,以及使用鍵盤的哪個鍵或鼠標的哪個鍵來終止捕獲等內容,這些設置使用 CAPTUREPARAMS 結構來描述,capCaptureGetSetup 宏來得到當前的設置,然后改變此結構的成員變量,再使用 capCaptureSetSetup 宏設置新的設置。設置捕獲速度,通過使用 capCaptureGetSetup 宏來得到當前的捕捉速度,將當前的捕捉速度保存在 CAPTUREPARAMS 結構的 dwRequestMicroSecPerFr
44、ame成員變量中,也可以通過設置此變量來改變當前設置值。設置終止捕獲,同樣通過使用 capCaptureGetSetup 宏來得到當前的設置,當前按鍵設置保存在 CAPTUREPARAMS 結構的 vKeyAbort 成員中,鼠標設置保存在 fAbortLeftMouse 和 fAbortRightMouse 成員中,通過修改可以設置新的熱健或者鼠標左右鍵,修改完成后,使用 capCaptureSetSetup 宏來進行更新。捕獲的時間限制,用 CAPTUREPARAMS 結構中的 fLimitEnabled 表示捕獲是否有時間的限制,wTimeLimit 用來設置指示捕獲最大的持續時間,其單
45、位為秒。使用 capCaptureGetSetup 宏來得到當前的設置值。下面程序為設置 CAPTUREPARAMS 結構的實現代碼:BOOL VideoCapture:SetCapturePara()CAPTUREPARMS CapParms=0;capCaptureGetSetup(m_capwnd,&CapParms,sizeof(CapParms);/得到當前的捕獲速度CapParms.fAbortLeftMouse = FALSE;CapParms.fAbortRightMouse = FALSE;CapParms.fYield = TRUE;CapParms.fCaptur
46、eAudio = FALSE;CapParms.wPercentDropForError = 80;第 16 頁 共 24 頁if(!capCaptureSetSetup(m_capwnd,&CapParms,sizeof(CapParms)/log.WriteString(n Failed to set the capture parameters );return FALSE;/ Set Video Format capGetVideoFormat(m_capwnd,&m_bmpinfo,sizeof(m_bmpinfo);m_bmpinfo.bmiHeader.biWid
47、th=IMAGE_WIDTH;m_bmpinfo.bmiHeader.biHeight=IMAGE_HEIGHT;BOOL ret=capSetVideoFormat(m_capwnd,&m_bmpinfo,sizeof(m_bmpinfo);/log.WriteString(n Video parameters set properly);return ret;/終止一個捕獲任務BOOL VideoCapture:StopCapture()capCaptureStop(m_capwnd);capCaptureAbort(m_capwnd);Sleep(500); return TRU
48、E;5.2.35.2.3 捕獲窗口捕獲窗口在捕獲前必須創建一個捕獲窗口(Capture Widnow) ,下面介紹有關捕獲窗口的情況:創建一個 AVICap 捕獲窗口,用 capCreateCaptureWindow 函數并返回一個句柄。將捕獲窗口連接至捕獲設備,用 capDriverConnect 函數來使一個捕獲窗口與一個捕獲設備連接或關聯連接上后,就可以通過捕獲窗口向捕獲設備發送各種消息,可以使用函數 capGetDriverDescription 來獲得已安裝的捕獲設備名稱及版本,將其列舉在實現程序過程中。再利用 capDriverGetName 函數來得到捕獲設備的名稱將獲得的版本發
49、送到 capDriverGetVersion。如果斷開捕獲窗口與捕獲設備的連接用 capDriverDisconnect。捕獲窗口的狀態,用 capGetStatus 函數來獲得當前捕獲窗口的狀態,得到一個 CAPSTATUS 結構的拷貝。該結構的內容包含了圖片的尺寸、卷軸的當前位置、overlay 和 preview 是否已設置。由于其信息是動態的,每當捕獲的視頻第 17 頁 共 24 頁流的尺寸發生改變,程序應該在獲取捕獲設備的視頻格式以后及時進行刷新。而捕獲窗口尺寸的改變并不影響實際的捕獲視頻流的尺寸。該尺寸由視頻捕獲設備的格式和視頻對話框決定。/捕獲窗口BOOL VideoCaptur
50、e:Initialize() char devname128=0,devversion128=0; int index=0; BOOL ret = TRUE, ret1 = TRUE, ret2 = TRUE, ret3 = TRUE; TRACE(VideoCapture:Initializen); /創建一個 AVICap 捕獲窗口 m_capwnd = capCreateCaptureWindow(Capture,WS_POPUP,0,0,1,1,0,0);if(!m_capwnd)return FALSE;/connect callback functionsret = capSetU
51、serData(m_capwnd,this);/Change destroy functions also. ret1 = capSetCallbackOnVideoStream(m_capwnd,OnCaptureVideo); /得到已安裝的捕獲設備的名稱及版本 ret2 = capGetDriverDescription(index,devname,100,devversion,100);/ Connect to webcam driver/使一個捕獲窗口與一個捕獲設備連接或關聯ret3 = capDriverConnect(m_capwnd,index);if(!(ret &
52、ret1 & ret2 & ret3)/ Device may be open already or it may not have been/ closed properly last time.AfxMessageBox(Unable to open Video Capture Device);/log.WriteString(n Unable to connect driver to the window);m_capwnd=NULL;return FALSE;第 18 頁 共 24 頁/ Set the capture parametersif(SetCapturePa
53、ra()=FALSE)/ log.WriteString(n Setting capture parameters failed); capDriverDisconnect(m_capwnd); /使捕獲窗口與一個捕獲設備斷開 return FALSE;return TRUE;5.2.45.2.4 視頻捕獲驅動視頻捕獲驅動視頻捕獲必須具有視頻捕獲驅動才能進行,其相關內容如下:視頻捕獲驅動的性能,capDriverGetCap 函數得到當前連接視頻驅動的硬件性能,該信息保存在 CAPDRIVERCAPS 結構中;視頻對話框,每個視頻驅動能夠提供 4 個對話框來控制視頻捕獲和數字化處理視頻對話框定
54、義的視頻壓縮率和圖像品質等。視頻對話框都在視頻捕獲驅動中定義。這個四個對話框分別為:Video Source 對話框用于控制選擇視頻來源(capDlgVideoSource) ;Video Format 對話框定義視頻幀的尺寸和精度,以及視頻捕獲卡的壓縮設置(capDlgVideoFormat);Video Display 對話框控制在視頻捕獲期間相關顯示器上的顯示(capDlgVideoDisplay);Video Compression 對話框控制壓縮和圖像品質(caoDlgVideoCompression)。5.2.55.2.5 語音錄制語音錄制在音頻的錄制和播放時,采用的用戶界面線程來
55、處理,是 CWinThread 對象,根據前面線程的介紹,一步一步的來實現。錄音用的一個 CWinThread 對象CAudioRec 來實現,部分實現代碼:LRESULT CAudioRec:OnStartRecording(WPARAM wp, LPARAM lp)if(recording)return FALSE;/打開錄音設備MMRESULT mmReturn = :waveInOpen( &m_hRecord, WAVE_MAPPER, &m_WaveFormatEx, :GetCurrentThreadId(), 0, CALLBACK_THREAD);if(mmR
56、eturn!=MMSYSERR_NOERROR ) return FALSE;if(mmReturn=MMSYSERR_NOERROR )第 19 頁 共 24 頁for(int i=0; i MAXRECBUFFER ; i+)/為錄音設備準備緩存mmReturn = :waveInPrepareHeader(m_hRecord,recheadi, sizeof(WAVEHDR);/給輸入設備增加一個緩存mmReturn = :waveInAddBuffer(m_hRecord,recheadi, sizeof(WAVEHDR);mmReturn = :waveInStart(m_hReco
57、rd); /開始錄音if(mmReturn=MMSYSERR_NOERROR ) recording=TRUE;return TRUE;5.2.65.2.6 語音回放語音回放相對錄音而言,播放就簡單多了,同樣用的一個 CWinThread 對象CAudioPlay 來實現,部分實現代碼:LRESULT CAudioPlay:OnWriteSoundData(WPARAM wParam, LPARAM lParam)/TRACE(CAudioPlay:OnWriteSoundDatan);MMRESULT mmResult = FALSE;char *p=NULL;int length=(int
58、) wParam;if(Playing=FALSE)return FALSE;if(lengthlpData=p;lpHdr-dwBufferLength = length;mmResult = :waveOutPrepareHeader(m_hPlay, lpHdr, sizeof(WAVEHDR); /為回放設備準備內存塊if(mmResult)delete lpHdr;delete p;return mmResult;mmResult = :waveOutWrite(m_hPlay, lpHdr, sizeof(WAVEHDR);/寫數據(放音)if(mmResult)delete lp
59、Hdr;delete p; return mmResult; m_Count+;return MMSYSERR_NOERROR;5.2.75.2.7 視音頻的傳輸視音頻的傳輸視頻采集采用 AVICap 從視頻采集卡捕獲視頻圖像,得到的是位圖形式的視頻幀,然后用 Divx 編碼器進行壓縮,壓縮以后形成以幀為格式的 Mpeg4 流。通過 Winsock 實現壓縮后的視頻數據在局域網中的實時傳輸,接收完的數據交給Divx 解碼器,以幀的格式解壓,最后實現視頻顯示。所以提出以幀為單位發送視頻數據流。為了在接收端能夠方便地提取出一幀,提出如表 1 所示的格式組建幀。完整的一幀由 5 個字段組成,各個字段
60、的意義如下:幀開始標志:標志著一幀地開始,占用 4 個字節的空間;幀大小:表示整個幀的大小,包括 5 個字段的大小,占用 4 個字節的空間;幀編號:表示幀的順序編號,占用 4 個字節的空間;幀類型:標志此幀是否是關鍵幀,占用 1 個字節的空間;幀數據:存放壓縮后一幀的完整數據。表 1 視頻幀的格式幀開始標志幀大小幀編號幀類型幀數據0 4 8 12 13 2012處理視頻傳輸如圖 11 所示。第 21 頁 共 24 頁圖 11 視頻的傳輸相對于視頻的傳輸,語音的傳輸就簡單得多了,在這里建立了兩個線程來處理,先來用一個語音錄制線程在一個客戶端錄制語音,再通過用 G729a 對語音進行編碼,然后傳輸到另一客戶端,同樣用 G729a 對語音進行解碼,然后用一個語音回放線程
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 分布式系統開發考試試題及答案指導
- 系統架構設計試題及答案
- 2025年精準把握的試題及答案
- 編程技巧的計算機二級VB試題及答案
- 戰略與運營管理整合試題及答案
- 降低開發成本考試題目及答案
- 2025年軟件設計師職業發展路徑試題及答案
- 詞匯運用高考語文試題及答案
- 法學概論重要考點與試題答案揭秘
- 四川省內江市2025屆七年級數學第二學期期末經典模擬試題含解析
- 十歲生日宴流程
- DB3307T 128-2023 共富工坊建設與星級評價規范
- 《推進鄉村振興中的的政府行為研究國內外文獻綜述》5100字
- 康養休閑旅游服務基礎知識單選題及答案解析
- 公司師徒制、導師制管理辦法(完整版方案)
- 解剖學公開課課件內分泌
- 家族財富管理
- 高中必修一英語單詞湘教版
- 森林防火預警監測
- 銀屑病臨床病例討論
- 涉密人員審查備案登記表
評論
0/150
提交評論