基于局域網(wǎng)的視頻聊天室系統(tǒng)的設(shè)計與實(shí)現(xiàn)—計算機(jī)畢業(yè)設(shè)計(論文)_第1頁
基于局域網(wǎng)的視頻聊天室系統(tǒng)的設(shè)計與實(shí)現(xiàn)—計算機(jī)畢業(yè)設(shè)計(論文)_第2頁
基于局域網(wǎng)的視頻聊天室系統(tǒng)的設(shè)計與實(shí)現(xiàn)—計算機(jī)畢業(yè)設(shè)計(論文)_第3頁
基于局域網(wǎng)的視頻聊天室系統(tǒng)的設(shè)計與實(shí)現(xiàn)—計算機(jī)畢業(yè)設(shè)計(論文)_第4頁
基于局域網(wǎng)的視頻聊天室系統(tǒng)的設(shè)計與實(shí)現(xiàn)—計算機(jī)畢業(yè)設(shè)計(論文)_第5頁
已閱讀5頁,還剩28頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、畢畢 業(yè)業(yè) 設(shè)設(shè) 計計( 論論 文文)基于局域網(wǎng)的視頻聊天室系統(tǒng)的設(shè)計與實(shí)現(xiàn)基于局域網(wǎng)的視頻聊天室系統(tǒng)的設(shè)計與實(shí)現(xiàn)論論文作者姓名:文作者姓名:申申請請學(xué)位學(xué)位專業(yè)專業(yè): :申申請請學(xué)位學(xué)位類別類別: :指指導(dǎo)導(dǎo)教教師師姓姓名名( (職職稱稱) ): :論論文提交日期:文提交日期:基于局域網(wǎng)的視頻聊天室系統(tǒng)的設(shè)計與實(shí)現(xiàn)基于局域網(wǎng)的視頻聊天室系統(tǒng)的設(shè)計與實(shí)現(xiàn)摘摘 要要視頻聊天系統(tǒng)作為一種新型的通信和交流工具,突破了地域的限制,可以提供更為便捷、靈活、全面的音、視頻信息的傳遞和服務(wù),具有極其廣泛的發(fā)展前景。本文介紹了采用 Microsoft Visual C+ 6.0 編程開發(fā)視頻聊天系統(tǒng)的一套比較

2、常用的解決方案。文字聊天采用 TCP 模式;語音視頻聊天采用 UDP 模式,在客戶端之間點(diǎn)對點(diǎn)的進(jìn)行。在該方案中,通過函數(shù)庫 VFW 來實(shí)現(xiàn)視頻捕獲、影像壓縮以及影像播放。微軟公司提供的專門用于視頻捕獲開發(fā)的工具包VFW,為在 Windows 操作系統(tǒng)中實(shí)現(xiàn)視頻捕獲提供了標(biāo)準(zhǔn)的接口,從而大大降低了程序的開發(fā)難度。在視頻傳輸方面,則通過組建視頻幀,將位圖形式的視頻幀壓縮成幀格式的 Mpeg4 流,傳輸?shù)娇蛻舳撕?,解壓并顯示影像。同時,在本方案中,采用了線程來實(shí)現(xiàn)語音錄制和語音回放,最終實(shí)現(xiàn)了通過服務(wù)器中轉(zhuǎn)的文字聊天、點(diǎn)對點(diǎn)的語音視頻聊天。關(guān)鍵詞關(guān)鍵詞:文字聊天;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目目 錄錄論文總頁數(shù):24 頁1引言.11.1課題背景.11.2國內(nèi)外研究現(xiàn)狀.12理論知識介紹.12.1VFW 簡介.12.2線程的實(shí)現(xiàn)方法.43需求分析.53.1軟硬件環(huán)境.53.2需求分析.54系統(tǒng)結(jié)構(gòu).74.1硬件結(jié)構(gòu).74.2軟件結(jié)構(gòu).74.2.1功能需求.74.2.2系

8、統(tǒng)功能模塊圖.84.3系統(tǒng)各模塊流程圖.85系統(tǒng)的詳細(xì)設(shè)計.105.1文字聊天.105.1.1TCP 套接字的運(yùn)用.105.1.2文字聊天實(shí)現(xiàn).115.2語音視頻聊天.135.2.1UDP 套接字的運(yùn)用.135.2.2視頻的捕獲.145.2.3捕獲窗口.165.2.4視頻捕獲驅(qū)動.185.2.5語音錄制.185.2.6語音回放.195.2.7視音頻的傳輸.20結(jié) 論.21參考文獻(xiàn).22致 謝.23聲 明.24第 1 頁 共 24 頁1 1 引言引言1.11.1 課題背景課題背景隨著 Internet 的不斷發(fā)展普及,網(wǎng)絡(luò)通訊越來越被千家萬戶所接受,成為人們生活中的一部分。網(wǎng)絡(luò)聊天已和手機(jī)等一樣

9、,成為人們運(yùn)用最為廣泛的通信工具之一。本畢業(yè)設(shè)計的目的主要是為了滿足人們通訊交流的便捷,實(shí)現(xiàn)靈活、全面的音、視頻信息的傳遞和服務(wù)。模擬騰訊公司的 QQ 聊天軟件,開發(fā)一個多功能的聊天系統(tǒng)軟件,本畢業(yè)設(shè)計主要實(shí)現(xiàn)視頻語音聊天、文字聊天等功能。1.21.2 國內(nèi)外研究現(xiàn)狀國內(nèi)外研究現(xiàn)狀隨著網(wǎng)絡(luò)寬帶業(yè)務(wù)的推廣與普及,加之視頻產(chǎn)品設(shè)備(如攝像頭、耳機(jī)、麥克風(fēng)等)的成熟,普通用戶可以輕松地借助網(wǎng)絡(luò)視頻通訊軟件,實(shí)現(xiàn)“面對面”的網(wǎng)絡(luò)交流。信息的無限量擴(kuò)大,交通工具的便捷,視頻技術(shù)的充分應(yīng)用等導(dǎo)致了行業(yè)間競爭的全球化,這就要求現(xiàn)代部門、企業(yè)要具備更加靈敏的神經(jīng),更扁平化的管理,更快速的反應(yīng)和決策,更貼切的市

10、場宣傳和服務(wù)。所有這一切是由信息技術(shù)的發(fā)展所帶來的,同樣也要求有先進(jìn)的信息技術(shù)來提高部門、企業(yè)的競爭力?,F(xiàn)代通訊已經(jīng)是越來越普及了,必須有效合理的運(yùn)用視頻產(chǎn)品類設(shè)備來提高信息的傳遞和交流。在同一個局域網(wǎng)中,充分、合理的運(yùn)用攝像頭、耳機(jī)、麥克風(fēng)等設(shè)備來實(shí)現(xiàn)文字聊天和語音視頻聊天更是我們生活、學(xué)習(xí)、工作的便利所在。2 2 理論知識介紹理論知識介紹2.12.1 VFWVFW 簡介簡介VFW 是 Microsoft 1992 年推出的關(guān)于數(shù)字視頻的一個軟件包,它能使應(yīng)用程序數(shù)字化并播放從傳統(tǒng)模擬視頻源得到的視頻剪輯。VFW 的一個關(guān)鍵思想是播放時不需要專用硬件,為了解決數(shù)字視頻數(shù)據(jù)量大的問題,需要對數(shù)

11、據(jù)進(jìn)行壓縮。它引進(jìn)了一種叫 AVI 的文件標(biāo)準(zhǔn),該標(biāo)準(zhǔn)未規(guī)定如何對視頻進(jìn)行捕獲、壓縮及播放,僅規(guī)定視頻和音頻該如何存儲在硬盤上,以及在 AVI 文件中交替存儲視頻幀和與之相匹配的音頻數(shù)據(jù)。VFW 給程序員提供 VBX 和 AVICap 窗口類的高級編程工具,使程序員能通過發(fā)送消息或設(shè)置屬性來捕獲、播放和編輯視頻剪輯。用戶不必專門安裝 VFW,在安裝 Windows 時,安裝程序會自動地安裝配置視頻所需的組件,如設(shè)備驅(qū)動程序、視頻壓縮程序等。VFW 主要由以下六個模塊組成:(1) AVICAP.DLL:包含了執(zhí)行視頻捕獲的函數(shù),它給 AVI 文件、I/O 和視頻音頻設(shè)備驅(qū)動程序提供一個高級接口;

12、(2) MSVIDEO.DLL:用一套特殊的 DrawDib 函數(shù)來處理屏幕上的視頻操第 2 頁 共 24 頁作;(3) MCIAVI.DRV:此驅(qū)動程序包括對 VFW 的 MCI 命令的解釋器;(4) AVIFILE.DLL:支持由標(biāo)準(zhǔn)多媒體 I/O(mmio)函數(shù)提供的更高的命令來訪問 AVI 文件;(5) 壓縮管理器(ICM):管理用于視頻壓縮/解壓縮的編解碼器(CODEC) ;(6) 音頻壓縮管理器 ACM:提供與 ICM 相似的服務(wù),不同的是它適于波形音頻。Visual C+在支持 VFW 方面提供有 vfw32.lib、msacm32.lib、winmm.lib等庫。特別是它提供了

13、功能強(qiáng)大、簡單易行、類似于 MCIWnd 的窗口類AVICap。AVICap 為應(yīng)用程序提供了一個簡單的、基于消息的接口,使之能訪問視頻和波形音頻硬件,并能在將視頻流捕獲到硬盤上的過程中進(jìn)行控制。AVICap 支持實(shí)時的視頻流捕獲和單幀捕獲,并提供對視頻源的控制。雖然MCI 也提供數(shù)字視頻服務(wù),比如,它為顯示 AVI 文件的視頻提供了 AVIVideo 命令集,為視頻疊加提供了 overlay 命令集,但這些命令主要是基于文件的操作,不能滿足實(shí)時地直接從視頻緩存中獲取數(shù)據(jù)的要求。對于使用沒有視頻疊加能力的捕獲卡的 PC 機(jī)來說,用 MCI 提供的命令集是無法捕獲視頻流的。而AVICap 在捕獲

14、視頻方面具有一定的優(yōu)勢,它能直接訪問視頻緩沖區(qū),不需要生成中間文件,實(shí)時性很強(qiáng),效率很高。同時,它也可將數(shù)字視頻捕獲到文件。在視頻捕獲之前需要創(chuàng)建一個捕獲窗,所有的捕獲操作及其設(shè)置都以它為基礎(chǔ)。用 AVICap 窗口類創(chuàng)建的窗口(通過 capCreateCaptureWindow 函數(shù)創(chuàng)建)被稱為“捕獲窗” ,其窗口風(fēng)格一般為 WS_CHILD 和 WS_VISIBLE。實(shí)際上,捕獲窗類似于標(biāo)準(zhǔn)控制(如按鈕、列表框等) 。捕獲窗具有下列功能:(1) 將視頻流和音頻流捕獲到一個 AVI 文件中;(2) 動態(tài)地同視頻和音頻輸入器件連接或斷開;(3) 以 Overlay 或 Preview 模式對輸

15、入的視頻流進(jìn)行實(shí)時顯示;(4) 在捕獲時可指定所用的文件名并能將捕獲文件的內(nèi)容拷貝到另一個文件;(5) 設(shè)置捕獲速率;(6) 顯示控制視頻源、視頻格式、視頻壓縮的對話框;(7) 創(chuàng)建、保存或載入調(diào)色板;(8) 將圖像和相關(guān)的調(diào)色板拷貝到剪貼板;(9) 將捕獲的一個單幀圖像保存為 DIB 格式的文件。AVICap 在顯示視頻時提供的兩種模式:第 3 頁 共 24 頁(A)預(yù)覽(Preview)模式:該模式使用 CPU 資源,視頻幀先從捕獲硬件傳到系統(tǒng)內(nèi)存,接著采用 GDI 函數(shù)在捕獲窗中顯示。在物理上,這種模式需要通過 VGA 卡在監(jiān)視器上顯示。(B)疊加(Overlay)模式:該模式使用硬件疊

16、加進(jìn)行視頻顯示,疊加視頻的顯示不經(jīng)過 VGA 卡,疊加視頻的硬件將 VGA 的輸出信號與其自身的輸出信號合并,形成組合信號顯示在計算機(jī)的監(jiān)視器上。只有部分視頻捕獲卡才具有視頻疊加能力。靈活編寫 AVICap 提供的回調(diào)函數(shù)還可滿足一些特殊需求。比如,將宏capCaptureSequenceNoFile 同用 capSetCallbackOnVideoStream 登記的回調(diào)函數(shù)一起使用,可使應(yīng)用程序直接使用視頻和音頻數(shù)據(jù)。在視頻聊天的應(yīng)用程序中可利用這一點(diǎn)來獲得視頻幀,回調(diào)函數(shù)將捕獲的圖像傳到遠(yuǎn)端的計算機(jī)。應(yīng)用程序可用捕獲窗來登記回調(diào)函數(shù)(由用戶編寫,而由系統(tǒng)調(diào)用) ,以便在發(fā)生下列情況時,它

17、能通知應(yīng)用程序,作出相應(yīng)的反應(yīng):捕獲窗狀態(tài)改變;出錯;視頻幀和音頻緩存可以使用;在捕獲過程中,其它應(yīng)用程序處于讓步(Yield)地位。視頻捕獲編程也要用到涉及視頻捕獲的結(jié)構(gòu)、宏、消息和函數(shù)。令人高興的是,發(fā)送 AVICap 窗口消息所能完成的功能都能調(diào)用相應(yīng)的宏來完成。例如,SendMessage(hWndCap,WM_CAP_DRIVER_CONNECT,0,0L)與capDriverConnect(hWndCap,0)的作用相同,都是將創(chuàng)建的捕獲窗同視頻輸入器件連接起來。視頻部分主要是利用 Video Capture 函數(shù)庫來獲取影像的。Video Capture主要提供下列功能:連接驅(qū)動

18、程序;獲取影像、聲音資料,并顯示在屏幕上或者是存成 AVI 文件;獲取單張影像顯示在屏幕上,拷貝至剪貼簿,或者是存成DIB(Device-Independent Bitmap)文件。Video Capture 的主要結(jié)構(gòu):結(jié)構(gòu)體 CAPTUREPARAMS 主要包含一些獲取圖像的參數(shù):DWORD dwRequestMicroSecPerFrame 代表相鄰兩個 frame 的獲取時間間隔;BOOL fYield 值為 TRUE,則表示 Windows 會以另一個 thread 來捕獲影像,值為FALSE,程序會在捕捉影像后顯示忙碌狀態(tài);BOOL fCaptureAudio 其值表示是否需要同時

19、獲取聲音資料。結(jié)構(gòu)體 BITMAPINFO 和點(diǎn)陣圖有關(guān),主要定義了影像獲取之后顯示在屏幕上、存儲在文件中的格式,它包含兩個成員:BITMAPINFOHEADER bmiHeader 描述影像性質(zhì)的結(jié)構(gòu),其成員記載了影像的大小、顏色深度和壓縮的方式,該成員在Video Capture、Video Compression Manager 和 DrawDib 函數(shù)庫中,以及有關(guān)第 4 頁 共 24 頁于點(diǎn)陣圖的應(yīng)用中;RGBQUAD bmiColors 指向 color table 第一個元素的位置。結(jié)構(gòu)體 COMPVARS 主要是記錄所有和壓縮相關(guān)的信息,重要的成員:DWORD fccHandl

20、er 為 compressor 句柄;LPBITMAPINFO lpbiIn 指向待壓縮影像BITMAPINFO 的指標(biāo);LPBITMAPINFO lpbitOut:指向壓縮完影像 BITMAPINFO 的指標(biāo);LONG lKey 代表 key-frame rate,而所謂 key frame 是指此 frame 在解壓縮時不需要依賴前面的 frame;LONG lQ 代表影像壓縮后的品質(zhì),取值為110000 的整數(shù)。Video Compression Functions 主要記錄壓縮功能相關(guān)的信息,其包含的比較重要的成員:ICLocate 輸入指向壓縮前后 BITMAPINFO 的指標(biāo),以及

21、欲使用的 codecs;ICCompressorChoose 呼叫一個系統(tǒng)內(nèi)建的對話,其中包含所有可能使用的 codes 以及其相關(guān)參數(shù);ICCompressQuery 詢問 compressor 是否支持某種壓縮方式,輸入?yún)?shù)為 compressor handle 及指向壓縮前后 BITMAPINFO 的指標(biāo),此函數(shù)會傳回詢問結(jié)果;ICCompressBegin 要求系統(tǒng)準(zhǔn)備相關(guān)資源以供壓縮之用;ICCompress 壓縮某個 frame;ICCompressEnd 歸還相關(guān)資源給系統(tǒng);ICDompressQuery 詢問 decompressor 是否支持某種解壓縮方式;ICDompres

22、sBegin 要求系統(tǒng)準(zhǔn)備相關(guān)資源以供解壓縮之用;ICDompress 解壓縮某一個 frame;ICDompressEnd 歸還相關(guān)資源給系統(tǒng);ICDompressFree 歸還COMPVARS 所占用的資源。2.22.2 線程的實(shí)現(xiàn)方法線程的實(shí)現(xiàn)方法線程是一個獨(dú)立的執(zhí)行流,是進(jìn)程內(nèi)部的一個獨(dú)立的執(zhí)行單元,相當(dāng)于一個子程序,它對應(yīng)于 Visual C+中的 CWinThread 類對象。單獨(dú)一個執(zhí)行程序運(yùn)行時,缺省地包含了一個主線程,主線程以函數(shù)地址的形式出現(xiàn),提供程序的啟動點(diǎn),當(dāng)主線程終止時,進(jìn)程也隨之終止。根據(jù)實(shí)際需要,應(yīng)用程序可以分解成許多獨(dú)立執(zhí)行的線程,每個線程并行的運(yùn)行在同一進(jìn)程中

23、。一個進(jìn)程中的所有線程都在該進(jìn)程的虛擬地址空間中,使用該進(jìn)程的全局變量和系統(tǒng)資源。操作系統(tǒng)給每個線程分配不同的 CPU 時間片,在某一個時刻,CPU 只執(zhí)行一個時間片內(nèi)的線程,多個時間片中的相應(yīng)線程在 CPU 內(nèi)輪流執(zhí)行,由于每個時間片時間很短,所以對用戶來說,仿佛各個線程在計算機(jī)中是并行處理的。操作系統(tǒng)是根據(jù)線程的優(yōu)先級來安排 CPU 的時間,優(yōu)先級高的線程優(yōu)先運(yùn)行,優(yōu)先級低的線程則繼續(xù)等待。Windows 提供了兩種線程:用戶界面線程和工作線程(又稱為后臺線程) 。用戶界面線程通常用來處理用戶的輸入并響應(yīng)各種事件和消息,其實(shí),應(yīng)用程序的主執(zhí)行線程 CWinApp 對象就是一個用戶界面線程,

24、當(dāng)應(yīng)用程序啟動時自動第 5 頁 共 24 頁創(chuàng)建和啟動,同樣它的終止也意味著該程序的結(jié)束,進(jìn)程終止。工作線程用來執(zhí)行程序的后臺處理任務(wù),比如計算、調(diào)度、對串口的讀寫操作等,它和用戶界面線程的區(qū)別是它不用從 CWinThread 類派生來創(chuàng)建,對它來說最重要的是如何實(shí)現(xiàn)工作線程任務(wù)的運(yùn)行控制函數(shù)。工作線程和用戶界面線程啟動時要調(diào)用同一個函數(shù)的不同版本;一個進(jìn)程中的所有線程共享它們父進(jìn)程的變量,但同時每個線程可以擁有自己的變量。這里主要介紹用戶界面線程的運(yùn)用:(1) 線程的啟動創(chuàng)建一個用戶界面線程,首先要從類 CwinThread 產(chǎn)生一個派生類,同時必須使 DECLARE_DYNCREATE 和

25、 IMPLEMENT_DYNCREATE 來聲明和實(shí)現(xiàn)這個CwinThread 派生類。第二步是根據(jù)需要重載該派生類的一些成員函數(shù)如:ExitInstance() 、InitInstance() 、OnIdle() 、PreTranslateMessage()等函數(shù)。最后調(diào)用 AfxBeginThread()函數(shù)的一個版本:CWinThread* AfxBeginThread (CRuntimeClass* pThreadClass,int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags

26、= 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL)啟動該用戶界面線程,其中第一個參數(shù)為指向定義的用戶界面線程類指針變量,第二個參數(shù)為線程的優(yōu)先級,第三個參數(shù)為線程所對應(yīng)的堆棧大小,第四個參數(shù)為線程創(chuàng)建時的附加標(biāo)志,缺省為正常狀態(tài),如為 CREATE_SUSPENDED 則線程啟動后為掛起狀態(tài)。(2) 線程的優(yōu)先級CwinThread 類的成員函數(shù)用于線程優(yōu)先級的操作:int GetThreadPriority() ;BOOL SetThradPriority()(int nPriority);(3) 線程的掛起和恢復(fù)CWinThread 類中包

27、含了應(yīng)用程序掛起和恢復(fù)它所創(chuàng)建的線程的函數(shù),其中SuspendThread()用來掛起線程,暫停線程的執(zhí)行;ResumeThread()用來恢復(fù)線程的執(zhí)行。如果你對一個線程連續(xù)若干次執(zhí)行 SuspendThread() ,則需要連續(xù)執(zhí)行相應(yīng)次的 ResumeThread()來恢復(fù)線程的運(yùn)行。(4) 結(jié)束線程終止線程有三種途徑,線程可以在自身內(nèi)部調(diào)用 AfxEndThread()來終止自身的運(yùn)行;可以在線程的外部調(diào)用 BOOL TerminateThread(HANDLE hThread, DWORD dwExitCode)來強(qiáng)行終止一個線程的運(yùn)行,然后調(diào)用 CloseHandle()函數(shù)釋放線

28、程所占用的堆棧;第三種方法是改變?nèi)肿兞?,使線程的執(zhí)行函數(shù)返回,則該線程終止。第 6 頁 共 24 頁3 3 需求分析需求分析3.13.1 軟硬件環(huán)境軟硬件環(huán)境電腦兩臺以上,分別配有攝像頭、麥克風(fēng)、音箱或耳機(jī)等外部設(shè)備;Windows XP 系統(tǒng),Microsoft Visual Studio 6.0 編程開發(fā)系統(tǒng)等。3.23.2 需求分析需求分析在同一個局域網(wǎng)中,如何根據(jù)自身業(yè)務(wù)的要求,量身定制,對視頻設(shè)備進(jìn)行合理搭配,選擇一套合理的視頻聊天室系統(tǒng)。如何來滿足局域網(wǎng)內(nèi)部用戶的通訊要求,在考慮到網(wǎng)絡(luò)帶寬的同時,提高視頻清晰度,動態(tài)畫面的流暢,語音的實(shí)時傳輸?shù)?,正是現(xiàn)代社會通訊所必需的。設(shè)計本系

29、統(tǒng)時,分析網(wǎng)絡(luò)承載、整個系統(tǒng)結(jié)構(gòu)的組建等是實(shí)現(xiàn)局域網(wǎng)文字聊天和語音視頻聊天所必需的。文字、語音視頻聊天作為一種廣泛的網(wǎng)絡(luò)應(yīng)用對其基礎(chǔ)的承載網(wǎng)絡(luò)環(huán)境有著較高的網(wǎng)絡(luò)要求。其中應(yīng)重點(diǎn)考慮的是網(wǎng)絡(luò)的帶寬情況、端到端的時延、時延抖動、丟包率等問題。(1)網(wǎng)絡(luò)帶寬需求,視頻聊天對網(wǎng)絡(luò)的帶寬需求為“視頻帶寬+IP 包頭開銷” ,計算方法為:網(wǎng)絡(luò)帶寬 = 視頻帶寬 1.2。(2)端到端的時延,網(wǎng)絡(luò)傳輸不可避免的會發(fā)生傳輸時延,通常建議視頻聊天的通用時延小于 150ms。(3)時延抖動,由于音頻/視頻的傳輸為實(shí)時的交互,因此網(wǎng)絡(luò)的時延抖動更為重要,一般,視頻聊天的時延抖動控制在 50ms 內(nèi)。(4)丟包率,網(wǎng)絡(luò)

30、數(shù)據(jù)傳輸經(jīng)常會出現(xiàn)丟包現(xiàn)象,視頻傳輸過程中數(shù)據(jù)丟包嚴(yán)重的話會影響在線視頻聊天質(zhì)量。因此,在設(shè)計上應(yīng)將網(wǎng)絡(luò)上的丟包率控制在 1%以內(nèi)。視頻聊天對實(shí)時性要求較高的網(wǎng)絡(luò)應(yīng)用,作為其基礎(chǔ)的承載網(wǎng)絡(luò)有較高的寬帶和對網(wǎng)絡(luò)中的業(yè)務(wù)流量有較高的控制能力。而視頻聊天系統(tǒng)本身對帶寬的要求為 62kbit/s2Mbit/s,但是為了滿足流暢的視音頻效果,要求帶寬不低于384kbit/s。文字、視頻聊天的功能和應(yīng)用效果體現(xiàn)在客戶端,而服務(wù)器端則是必不可少的,對于系統(tǒng)的需求分析在系統(tǒng)設(shè)計的過程中應(yīng)該明確、細(xì)致:(1) 文字聊天:首先啟動服務(wù)器端,當(dāng)用戶啟動客戶端時,用服務(wù)器保存的用戶名和密碼來驗(yàn)證客戶是否已經(jīng)登錄到服務(wù)

31、器。只有當(dāng)有兩個以上的用戶啟動客戶端時,才可以進(jìn)行文字聊天,聊天內(nèi)容要經(jīng)過服務(wù)器中轉(zhuǎn),分別在服務(wù)器端和兩個聊天的客戶端顯示聊天。(2) 語音視頻聊天:在有兩個客戶在線的情況下,才能進(jìn)行語音視頻聊天。兩個用戶要進(jìn)行語音視頻聊天時,一個用戶選中另一個用戶的用戶名,根第 7 頁 共 24 頁據(jù)該用戶名在后臺鏈表中的對應(yīng) IP 地址查找用戶并請求視頻連接。當(dāng)雙方確認(rèn)視頻連接后就進(jìn)行視頻傳輸,并顯示在客戶端,同時用線程實(shí)現(xiàn)語音錄制和回放。這樣,兩個用戶就實(shí)現(xiàn)了點(diǎn)對點(diǎn)的語音視頻聊天。在進(jìn)行語音視頻聊天的過程中,不能再與其它用戶進(jìn)行語音視頻聊天,但能夠與其它用戶進(jìn)行文字聊天。4 4 系統(tǒng)結(jié)構(gòu)系統(tǒng)結(jié)構(gòu)4.14

32、.1 硬件結(jié)構(gòu)硬件結(jié)構(gòu)該系統(tǒng)采用的是 Server/Client 結(jié)構(gòu),服務(wù)器端是一臺 PC 機(jī),而客戶端是PC 機(jī)和一個數(shù)字?jǐn)z像頭、耳機(jī)和麥克風(fēng)。它們進(jìn)行文字聊天時,要經(jīng)過服務(wù)器進(jìn)行中轉(zhuǎn),而當(dāng)進(jìn)行語音視頻聊天時是客戶端與客戶端之間直接進(jìn)行的點(diǎn)對點(diǎn)的連接,它們之間的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)如圖 1。在圖中,為了簡便,沒有畫出麥克風(fēng)、音箱或耳機(jī)等外部設(shè)備。圖 1 網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)圖4.24.2 軟件結(jié)構(gòu)軟件結(jié)構(gòu)4.2.14.2.1 功能需求功能需求通過需求調(diào)研并分析,確定系統(tǒng)具備的基本功能,包括:文字聊天、語音視頻聊天。(1) 文字聊天:文字聊天采用的是 TCP 模式,包括服務(wù)器端和客戶端。首先啟動服務(wù)器端,客

33、戶端通過用戶名和密碼登錄服務(wù)器,服務(wù)器響應(yīng)客戶端登錄并提示有用戶登錄,此時兩個用戶就可以進(jìn)行文字聊天,在文字聊天時通過服務(wù)器中轉(zhuǎn),而每個用戶可以同時與多個用戶進(jìn)行文字聊天。當(dāng)有用戶退出時,服務(wù)器做出響應(yīng),提示在線用戶,用戶下線。第 8 頁 共 24 頁(2) 語音視頻聊天:語音視頻聊天時采用的是 UCP 模式,客戶端與客戶端點(diǎn)對點(diǎn)的進(jìn)行,不需要經(jīng)過服務(wù)器端中轉(zhuǎn)。在文字聊天的基礎(chǔ)上,客戶端之間自行處理的語音視頻聊天,運(yùn)用 VFW 函數(shù)庫中的函數(shù)對 USB 口輸入的數(shù)字視頻信息進(jìn)行相關(guān)處理,比如:視頻捕獲、影像壓縮以及影像播放等,同時利用線程來處理聲音部分的錄制、回放等。A 客戶端向 B 客戶端請

34、求語音視頻聊天是通過 B 客戶端的用戶名來獲得 B 客戶端的 IP 地址,并向 B 客戶端發(fā)送語音視頻聊天請求,當(dāng) B 客戶端接受后捕獲視頻,并進(jìn)行壓縮傳輸?shù)?A 客戶端解壓并進(jìn)行顯示,在 B 客戶端接受視頻的同時,A 客戶端也捕獲視頻,壓縮傳輸?shù)?B 客戶端解壓并進(jìn)行顯示。4.2.24.2.2 系統(tǒng)功能模塊圖系統(tǒng)功能模塊圖該系統(tǒng)分為服務(wù)器端和客戶端,完成了文字聊天和語音視頻聊天,使用上只有文字聊天時才會通過服務(wù)器端,而對于語音視頻聊天就只需要對整個在線客戶端兩兩之間進(jìn)行點(diǎn)對點(diǎn)的視頻聊天。而在語音視頻時包括了視頻捕獲、視頻壓縮、解壓縮、語音錄制、語音回放以及視頻傳輸?shù)取U麄€系統(tǒng)的功能模塊圖如圖

35、 2?;谟诰志钟蛴蚓W(wǎng)網(wǎng)的的視視頻頻聊聊天天室室系系統(tǒng)統(tǒng)語語音音視視頻頻聊聊天天視視頻頻捕捕獲獲視視頻頻壓壓縮縮、解解壓壓縮縮視視頻頻傳傳輸輸服服務(wù)務(wù)器器中中轉(zhuǎn)轉(zhuǎn)語語音音錄錄制制語語音音回回放放文文字字聊聊天天圖 2 系統(tǒng)功能模塊圖4.34.3 系統(tǒng)各模塊流程圖系統(tǒng)各模塊流程圖在整個系統(tǒng)中主要運(yùn)行兩個功能:圖 3 文字聊天流程圖和圖 4 語音視頻聊天流程圖。第 9 頁 共 24 頁圖 3 文字聊天流程圖圖 4 語音視頻聊天流程圖第 10 頁 共 24 頁5 5 系統(tǒng)的詳細(xì)設(shè)計系統(tǒng)的詳細(xì)設(shè)計5.15.1 文字聊天文字聊天5.1.15.1.1 TCPTCP 套接字的運(yùn)用套接字的運(yùn)用在文字聊天時,

36、服務(wù)器端與客戶端的連接是采用的 TCP 套接節(jié)進(jìn)行連接。TCP 套接字的使用如圖 5。創(chuàng)建 CSocket 對象 CSocketServer 來處理服務(wù)器端與客戶端的連接,CSocket 繼承于 CasyncSocket,是 Windows Socket API 的高層抽象。CSocket 通常和 CsocketFile 以及 Carchive 類混合使用,這兩個類負(fù)責(zé)數(shù)據(jù)的發(fā)送和接收。要使用 CSocket 對象,首先要調(diào)用構(gòu)造函數(shù),然后調(diào)用Create 函數(shù)創(chuàng)建一個 Socket 句柄。CSocket 函數(shù)缺省是創(chuàng)建一個流 Socket;如果沒有使用 CArchive 類,那么還可以創(chuàng)建一

37、個數(shù)據(jù)報 Socket。服務(wù)器端調(diào)用 Accept,客戶端調(diào)用 Connect,然后創(chuàng)建一個 CsocketFile 去關(guān)聯(lián)CSocket。接下來的操作可以創(chuàng)建 CArchive 對象關(guān)聯(lián) CsocketFile,以用來發(fā)送和接收數(shù)據(jù)。第 11 頁 共 24 頁圖 5 TCP 套接字的使用5.1.25.1.2 文字聊天實(shí)現(xiàn)文字聊天實(shí)現(xiàn)ChatServer 服務(wù)器運(yùn)行時,利用一個 CSocket 對象 CSocketServer 啟動服務(wù)器,用函數(shù) gethostname 來獲得服務(wù)器端主機(jī)名和 IP,同時在服務(wù)器對話框中顯示服務(wù)器 IP,并將分配的固定端口號 8123 顯示在對話框中。用一個

38、list列表顯示在線用戶,隨時更新用戶登錄情況,用一個 edit box 顯示客戶端的聊天內(nèi)容以及系統(tǒng)提示消息。每一個 ChatClient 客戶端啟動時,利用服務(wù)器內(nèi)定的用戶號和密碼來登錄(如圖 6)。在整個系統(tǒng)中,利用鏈表來處理所有的用戶信息:當(dāng)有用戶登錄時,在鏈表尾部加入該用戶信息;當(dāng)用戶下線時,在該鏈表中刪除用戶,并提示所有用戶,該用戶下線。在對鏈表進(jìn)行操作的同時,要更新 list 列表中的信息。圖 6 用戶登錄界面ChatServer 服務(wù)器端響應(yīng)客戶端文字聊天時的中轉(zhuǎn)情況如圖 7。圖 7 服務(wù)器響應(yīng)文字聊天信息中轉(zhuǎn)第 12 頁 共 24 頁ChatClient 客戶端兩兩間進(jìn)行文字

39、聊天時,發(fā)送信息的處理函數(shù)如下:void CChatClientDlg:OnChatBtSend() /發(fā)送信息按鍵if( !m_bConnect)SetMessageBox(請連接服務(wù)器!rn);return ;CString str;CString szUserName;CMesg msg;GetDlgItemText(IDC_MESSAGE,str);GetDlgItemText(IDC_USERNAME,szUserName);if( str.GetLength() = 0 )SetMessageBox(請輸入想要發(fā)送的信息!rn);return ;if ( szUserName.Ge

40、tLength() SendM(&msg);AddReceiver(szUserName , true);AddChatMessage(str);在聊天兩個客戶端的信息情況如圖 8 和圖 9。第 13 頁 共 24 頁圖 8 接收文字信息圖 9 發(fā)送文字信息5.25.2 語音視頻聊天語音視頻聊天5.2.15.2.1 UDPUDP 套接字的運(yùn)用套接字的運(yùn)用在實(shí)現(xiàn)語音視頻聊天時,采用的是基于 UDP 套接字的點(diǎn)對點(diǎn)模式,而 UDP 面向的是無連接的數(shù)據(jù)服務(wù),其套接字的使用如圖 10 所示。第 14 頁 共 24 頁圖 10 UDP 套接字的使用5.2.25.2.2 視頻的捕獲視頻的捕獲利用

41、 VFW 接口,視頻捕獲可以分為以下幾個步驟:(1) 建立視頻采集窗口:該窗口用來接收視頻捕捉驅(qū)動程序傳來的數(shù)據(jù)和消息。(2) 連接視頻驅(qū)動程序:將建立的視頻捕捉窗口與視頻設(shè)備驅(qū)動程序相連。(3) 視頻捕獲初始化。(4) 視頻捕捉設(shè)置:VFW 下視頻捕捉參數(shù)的設(shè)置可以通過調(diào)用函數(shù)或彈出對話框的形式來實(shí)現(xiàn)。一般視頻驅(qū)動程序允許設(shè)置的參數(shù)包括視頻源選擇、視頻格式、視頻顯示格式等。(5) 設(shè)置回調(diào)函數(shù):通過回調(diào)函數(shù)來通知程序視頻事件的發(fā)生,比如捕捉一幀圖像成功的消息,捕捉出錯的消息等。(6) 結(jié)束捕捉:結(jié)束捕捉是應(yīng)該有一些清除工作。如釋放分配的內(nèi)存,斷開捕捉窗口與視頻捕捉驅(qū)動程序的連接,清除視頻捕捉

42、窗口等。窗口類為捕獲數(shù)字視頻流及其相關(guān)操作提供了很大的方便,靈活編寫其中第 15 頁 共 24 頁的回調(diào)函數(shù)可滿足實(shí)時視頻傳輸?shù)男枰?,例如?yīng)用程序可直接從緩沖中取得數(shù)字視頻并對其進(jìn)行壓縮編碼后實(shí)時地傳到遠(yuǎn)端的客戶端。在 VC+中,采用 VFW 技術(shù),客戶端通過 capSetCallbackOnFrame()注冊回調(diào)函數(shù),當(dāng)采集卡采集到一幅圖像后,系統(tǒng)就會自動調(diào)用回調(diào)函數(shù),然后再回調(diào)函數(shù)中使用 ICSeqCompressFrame()函數(shù)進(jìn)行壓縮。然后再通過 Winsock 將壓縮后的數(shù)據(jù)發(fā)送到另一客戶端。該客戶端接收完一幀以后,交給ICDecompress()解壓,最后用 SetDIBitsT

43、oDevice()將圖像顯示出來?;镜牟东@設(shè)置包括設(shè)置捕獲速度(每秒捕獲多少幀) 、是否同時捕獲聲頻、捕獲緩沖、允許最大丟失多少幀和是否使用 DOS 內(nèi)存,以及使用鍵盤的哪個鍵或鼠標(biāo)的哪個鍵來終止捕獲等內(nèi)容,這些設(shè)置使用 CAPTUREPARAMS 結(jié)構(gòu)來描述,capCaptureGetSetup 宏來得到當(dāng)前的設(shè)置,然后改變此結(jié)構(gòu)的成員變量,再使用 capCaptureSetSetup 宏設(shè)置新的設(shè)置。設(shè)置捕獲速度,通過使用 capCaptureGetSetup 宏來得到當(dāng)前的捕捉速度,將當(dāng)前的捕捉速度保存在 CAPTUREPARAMS 結(jié)構(gòu)的 dwRequestMicroSecPerFr

44、ame成員變量中,也可以通過設(shè)置此變量來改變當(dāng)前設(shè)置值。設(shè)置終止捕獲,同樣通過使用 capCaptureGetSetup 宏來得到當(dāng)前的設(shè)置,當(dāng)前按鍵設(shè)置保存在 CAPTUREPARAMS 結(jié)構(gòu)的 vKeyAbort 成員中,鼠標(biāo)設(shè)置保存在 fAbortLeftMouse 和 fAbortRightMouse 成員中,通過修改可以設(shè)置新的熱健或者鼠標(biāo)左右鍵,修改完成后,使用 capCaptureSetSetup 宏來進(jìn)行更新。捕獲的時間限制,用 CAPTUREPARAMS 結(jié)構(gòu)中的 fLimitEnabled 表示捕獲是否有時間的限制,wTimeLimit 用來設(shè)置指示捕獲最大的持續(xù)時間,其單

45、位為秒。使用 capCaptureGetSetup 宏來得到當(dāng)前的設(shè)置值。下面程序?yàn)樵O(shè)置 CAPTUREPARAMS 結(jié)構(gòu)的實(shí)現(xiàn)代碼:BOOL VideoCapture:SetCapturePara()CAPTUREPARMS CapParms=0;capCaptureGetSetup(m_capwnd,&CapParms,sizeof(CapParms);/得到當(dāng)前的捕獲速度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;/終止一個捕獲任務(wù)BOOL VideoCapture:StopCapture()capCaptureStop(m_capwnd);capCaptureAbort(m_capwnd);Sleep(500); return TRU

48、E;5.2.35.2.3 捕獲窗口捕獲窗口在捕獲前必須創(chuàng)建一個捕獲窗口(Capture Widnow) ,下面介紹有關(guān)捕獲窗口的情況:創(chuàng)建一個 AVICap 捕獲窗口,用 capCreateCaptureWindow 函數(shù)并返回一個句柄。將捕獲窗口連接至捕獲設(shè)備,用 capDriverConnect 函數(shù)來使一個捕獲窗口與一個捕獲設(shè)備連接或關(guān)聯(lián)連接上后,就可以通過捕獲窗口向捕獲設(shè)備發(fā)送各種消息,可以使用函數(shù) capGetDriverDescription 來獲得已安裝的捕獲設(shè)備名稱及版本,將其列舉在實(shí)現(xiàn)程序過程中。再利用 capDriverGetName 函數(shù)來得到捕獲設(shè)備的名稱將獲得的版本發(fā)

49、送到 capDriverGetVersion。如果斷開捕獲窗口與捕獲設(shè)備的連接用 capDriverDisconnect。捕獲窗口的狀態(tài),用 capGetStatus 函數(shù)來獲得當(dāng)前捕獲窗口的狀態(tài),得到一個 CAPSTATUS 結(jié)構(gòu)的拷貝。該結(jié)構(gòu)的內(nèi)容包含了圖片的尺寸、卷軸的當(dāng)前位置、overlay 和 preview 是否已設(shè)置。由于其信息是動態(tài)的,每當(dāng)捕獲的視頻第 17 頁 共 24 頁流的尺寸發(fā)生改變,程序應(yīng)該在獲取捕獲設(shè)備的視頻格式以后及時進(jìn)行刷新。而捕獲窗口尺寸的改變并不影響實(shí)際的捕獲視頻流的尺寸。該尺寸由視頻捕獲設(shè)備的格式和視頻對話框決定。/捕獲窗口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); /創(chuàng)建一個 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); /得到已安裝的捕獲設(shè)備的名稱及版本 ret2 = capGetDriverDescription(index,devname,100,devversion,100);/ Connect to webcam driver/使一個捕獲窗口與一個捕獲設(shè)備連接或關(guān)聯(lián)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); /使捕獲窗口與一個捕獲設(shè)備斷開 return FALSE;return TRUE;5.2.45.2.4 視頻捕獲驅(qū)動視頻捕獲驅(qū)動視頻捕獲必須具有視頻捕獲驅(qū)動才能進(jìn)行,其相關(guān)內(nèi)容如下:視頻捕獲驅(qū)動的性能,capDriverGetCap 函數(shù)得到當(dāng)前連接視頻驅(qū)動的硬件性能,該信息保存在 CAPDRIVERCAPS 結(jié)構(gòu)中;視頻對話框,每個視頻驅(qū)動能夠提供 4 個對話框來控制視頻捕獲和數(shù)字化處理視頻對話框定

54、義的視頻壓縮率和圖像品質(zhì)等。視頻對話框都在視頻捕獲驅(qū)動中定義。這個四個對話框分別為:Video Source 對話框用于控制選擇視頻來源(capDlgVideoSource) ;Video Format 對話框定義視頻幀的尺寸和精度,以及視頻捕獲卡的壓縮設(shè)置(capDlgVideoFormat);Video Display 對話框控制在視頻捕獲期間相關(guān)顯示器上的顯示(capDlgVideoDisplay);Video Compression 對話框控制壓縮和圖像品質(zhì)(caoDlgVideoCompression)。5.2.55.2.5 語音錄制語音錄制在音頻的錄制和播放時,采用的用戶界面線程來

55、處理,是 CWinThread 對象,根據(jù)前面線程的介紹,一步一步的來實(shí)現(xiàn)。錄音用的一個 CWinThread 對象CAudioRec 來實(shí)現(xiàn),部分實(shí)現(xiàn)代碼:LRESULT CAudioRec:OnStartRecording(WPARAM wp, LPARAM lp)if(recording)return FALSE;/打開錄音設(shè)備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+)/為錄音設(shè)備準(zhǔn)備緩存mmReturn = :waveInPrepareHeader(m_hRecord,recheadi, sizeof(WAVEHDR);/給輸入設(shè)備增加一個緩存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 來實(shí)現(xiàn),部分實(shí)現(xiàn)代碼: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); /為回放設(shè)備準(zhǔn)備內(nèi)存塊if(mmResult)delete lpHdr;delete p;return mmResult;mmResult = :waveOutWrite(m_hPlay, lpHdr, sizeof(WAVEHDR);/寫數(shù)據(jù)(放音)if(mmResult)delete lp

59、Hdr;delete p; return mmResult; m_Count+;return MMSYSERR_NOERROR;5.2.75.2.7 視音頻的傳輸視音頻的傳輸視頻采集采用 AVICap 從視頻采集卡捕獲視頻圖像,得到的是位圖形式的視頻幀,然后用 Divx 編碼器進(jìn)行壓縮,壓縮以后形成以幀為格式的 Mpeg4 流。通過 Winsock 實(shí)現(xiàn)壓縮后的視頻數(shù)據(jù)在局域網(wǎng)中的實(shí)時傳輸,接收完的數(shù)據(jù)交給Divx 解碼器,以幀的格式解壓,最后實(shí)現(xiàn)視頻顯示。所以提出以幀為單位發(fā)送視頻數(shù)據(jù)流。為了在接收端能夠方便地提取出一幀,提出如表 1 所示的格式組建幀。完整的一幀由 5 個字段組成,各個字段

60、的意義如下:幀開始標(biāo)志:標(biāo)志著一幀地開始,占用 4 個字節(jié)的空間;幀大?。罕硎菊麄€幀的大小,包括 5 個字段的大小,占用 4 個字節(jié)的空間;幀編號:表示幀的順序編號,占用 4 個字節(jié)的空間;幀類型:標(biāo)志此幀是否是關(guān)鍵幀,占用 1 個字節(jié)的空間;幀數(shù)據(jù):存放壓縮后一幀的完整數(shù)據(jù)。表 1 視頻幀的格式幀開始標(biāo)志幀大小幀編號幀類型幀數(shù)據(jù)0 4 8 12 13 2012處理視頻傳輸如圖 11 所示。第 21 頁 共 24 頁圖 11 視頻的傳輸相對于視頻的傳輸,語音的傳輸就簡單得多了,在這里建立了兩個線程來處理,先來用一個語音錄制線程在一個客戶端錄制語音,再通過用 G729a 對語音進(jìn)行編碼,然后傳輸?shù)搅硪豢蛻舳耍瑯佑?G729a 對語音進(jìn)行解碼,然后用一個語音回放線程

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論