網(wǎng)絡聊天工具的設計與實現(xiàn)畢業(yè)設計_第1頁
已閱讀1頁,還剩34頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p> 學號:</p><p> 畢業(yè)設計</p><p> 題 目:網(wǎng)絡聊天工具的設計與實現(xiàn)</p><p> 作 者屆 別2010屆</p><p> 系 別機械與電子工程系專 業(yè)計算機科學與技術</p><p> 指導老師職 稱講師</p><p&g

2、t; 完成時間</p><p><b>  摘 要</b></p><p>  視頻聊天系統(tǒng)作為一種新型的通信和交流工具,突破了地域的限制,可以提供更為便捷、靈活、全面的音、視頻信息的傳遞和服務,具有極其廣泛的發(fā)展前景。</p><p>  本文介紹了采用Microsoft Visual C++ 6.0編程開發(fā)視頻聊天系統(tǒng)的一套比較常用的解

3、決方案。文字聊天采用TCP模式;語音視頻聊天采用UDP模式,在客戶端之間點對點的進行。在該方案中,通過函數(shù)庫VFW來實現(xiàn)視頻捕獲、影像壓縮以及影像播放。微軟公司提供的專門用于視頻捕獲開發(fā)的工具包VFW,為在Windows操作系統(tǒng)中實現(xiàn)視頻捕獲提供了標準的接口,從而大大降低了程序的開發(fā)難度。在視頻傳輸方面,則通過組建視頻幀,將位圖形式的視頻幀壓縮成幀格式的Mpeg4流,傳輸?shù)娇蛻舳撕?,解壓并顯示影像。同時,在本方案中,采用了線程來實現(xiàn)語音

4、錄制和語音回放,最終實現(xiàn)了通過服務器中轉的文字聊天、點對點的語音視頻聊天。</p><p>  關鍵詞:文字聊天;視頻捕獲;視頻傳輸;語音錄制與回放</p><p><b>  Abstract</b></p><p>  As a new tool about communication, video chatting system has

5、broken through geographical restrictions, has provides more convenient, flexible and complete transmission and service. Furthermore, it has a very bright future.</p><p>  The common solution about how to dev

6、elop 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

7、, Video Compression Manager and DrawDib are realized 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

8、 capture in Windows Oper</p><p>  Keywords: text chatting; Video Capture; video transmission; audio recording and playing</p><p><b>  目 錄</b></p><p><b>  摘 要I&

9、lt;/b></p><p>  AbstractII</p><p>  第一章 引 言1</p><p><b>  1.1課題背景1</b></p><p>  1.2國內(nèi)外研究現(xiàn)狀1</p><p>  1.3本課題研究的意義2</p><p> 

10、 第二章 理論知識介紹4</p><p>  2.1 C++語言的介紹4</p><p>  2.2 VFW簡介5</p><p>  2.3 C/S結構的介紹8</p><p>  2.4線程的實現(xiàn)方法9</p><p>  第三章 需求分析11</p><p>  3.1軟硬

11、件環(huán)境11</p><p>  3.2需求分析11</p><p>  第四章 系統(tǒng)結構13</p><p>  4.1硬件結構13</p><p>  4.2軟件結構13</p><p>  4.2.1功能需求13</p><p>  4.2.2系統(tǒng)功能模塊圖14</p&

12、gt;<p>  4.3系統(tǒng)各模塊流程圖14</p><p>  第五章 系統(tǒng)的詳細設計16</p><p>  5.1文字聊天16</p><p>  5.1.1 TCP套接字的運用16</p><p>  5.1.2 文字聊天實現(xiàn)17</p><p>  5.2語音視頻聊天19</p

13、><p>  5.2.1 UDP套接字的運用19</p><p>  5.2.2視頻的捕獲20</p><p>  5.2.3捕獲窗口22</p><p>  5.2.4視頻捕獲驅動24</p><p>  5.2.5語音錄制24</p><p>  5.2.6語音回放25</p&

14、gt;<p>  5.2.7視音頻的傳輸26</p><p><b>  結 論28</b></p><p><b>  參考文獻29</b></p><p><b>  致 謝30</b></p><p><b>  第一章 引

15、言</b></p><p><b>  1.1課題背景</b></p><p>  隨著互聯(lián)網(wǎng)技術的發(fā)展,互聯(lián)網(wǎng)應用越來越豐富?;ヂ?lián)網(wǎng)以其獨特的傳播方式吸引了大量用戶,同時也給人們帶來了許多便利,譬如可以借助于網(wǎng)絡進行相互交流、信息傳遞等。聊天工具作為互聯(lián)網(wǎng)中運用最為廣泛的通信工具之一,它可以讓用戶之間進行即時的交流和信息的傳遞。聊天工具的出現(xiàn)可以說是基于

16、互聯(lián)網(wǎng)通信交流方式的歷史性變革,它已經(jīng)漸漸取代了原來效率低、費用高的如信件、電報的通信方式,以其快速、交互、簡便的方式給用戶的交流提供了簡單、易用的信息平臺,成為現(xiàn)今應用最為廣泛的即時通信工具之一。隨著相關技術的日益發(fā)展,用戶對功能的需求不斷提高。為了更好地服務于用戶,聊天工具的功能也在不斷地完善。在未來的網(wǎng)絡時代中,聊天工具將以即時通信為其基本特點,并與各種網(wǎng)絡應用整合,同時隨著無線網(wǎng)絡的廣泛應用,它將成為未來不可缺少的一種通信軟件。

17、本畢業(yè)設計的目的主要是為了滿足人們通訊交流的便捷,實現(xiàn)靈活、全面的語音、視頻信息的傳遞和服務。模擬騰訊公司的QQ聊天軟件,開發(fā)一個多功能的聊天系統(tǒng)軟件,本畢業(yè)設計主要實現(xiàn)視頻語音聊天、文字聊天功能。</p><p>  1.2國內(nèi)外研究現(xiàn)狀</p><p>  中國的大部分網(wǎng)絡用戶都擁有自己的QQ號碼。騰訊計算機系統(tǒng)有限公司成立于1998年11月。1999年2月,騰訊自主開發(fā)了基于Inte

18、rnet的即時通信網(wǎng)絡工具——騰訊即時通信Tencent Instant Messenger,簡稱TIM或騰訊QQ。騰訊QQ經(jīng)過三年時間的發(fā)展,到2002年,其用戶群成為中國最大的互聯(lián)網(wǎng)注冊用戶群,注冊用戶達到1億6000萬,其中活躍用戶總數(shù)超過5000萬。自此騰訊QQ成為中國最大的即時通信服務提供商。騰訊公司是中國最早也是目前中國市場上最大的本土互聯(lián)網(wǎng)即時通信軟件開發(fā)商。公司成立7年多以來,一直以追求卓越的技術為導向,始終處于穩(wěn)健、高

19、速發(fā)展的狀態(tài)。騰訊QQ超過4.3億的注冊用戶群體現(xiàn)了網(wǎng)絡用戶對騰訊QQ這一聊天工具的廣泛應用。在當今市場經(jīng)濟高速發(fā)展的前提下,騰訊QQ也在不斷自我完善,漸漸地演變?yōu)橐粋€人性化、市場化的多功能的聊天工具軟件,它可以給網(wǎng)絡聊天用戶帶來越來越多的人性化服務:從原來單一的文字聊天過渡到集語音、視頻、文件傳輸?shù)榷喙δ苡谝簧淼牧奶燔浖?lt;/p><p>  ICQ和MSN是在國外比較盛行的即時聊天工具,騰訊QQ的開發(fā)對MSN

20、和ICQ都進行了借鑒。ICQ是I Seek You(我找你)的縮寫,最初是一家以色列公司開發(fā)出來的免費軟件,中文名稱目前可以稱之為“網(wǎng)絡呼叫器”,它在全球擁有超過4000萬的用戶。事實上這種軟件最主要的功能就是讓用戶知道網(wǎng)絡上的朋友現(xiàn)在有沒有上線(前提是對方也有安裝ICQ),然后可以互送Messages(消息)交談或是交換檔案等等,比電子郵件更具即時性。正如一位ICQ軟件的最初程序設計員所說:“當你登錄因特網(wǎng)之后,你周圍都是些自己熟悉的

21、人,而且,你還可以和他們分享這種體驗,這的確是一件令人激動的事情?!?lt;/p><p>  MSN是微軟推出的聊天軟件,是一套類似ICQ的網(wǎng)上即時通訊軟件,它以最簡單的方式為用戶提供強有力的即時消息支持,同時能使Microsoft Outlook Express(R) 和MSN Hotmail(R)變得更簡單易用。MSN Messenger Service 還可使用戶間的聯(lián)機交談變得更加輕松愉快,了解誰在聯(lián)機以及查

22、看用戶何時聯(lián)機并與其交換即時消息。用戶間可以進行單獨的聊天,或者在同一個對話窗口中與多達四個的聯(lián)系人進行聊天。自動的輸入指示器可讓用戶知道何時聯(lián)系人正在輸入答復,還可以進行全球電話呼叫——以非常低的費用呼叫世界的任何地方。用戶可以選擇所要使用的電話服務提供商,從服務提供商的列表中選擇最適合的提供商。用交談取代鍵盤輸入,使用計算機上的話筒和揚聲器就可以和位于世界各地的朋友進行交談,甚至可以呼叫聯(lián)系人將文本消息發(fā)送到聯(lián)系人的移動電話和傳呼機

23、上(注:此特性僅適用于美國和加拿大),而進入“聊天室”結識新朋友,或加入與名人聊天,此特性在所有地區(qū)都適用。用戶可以使用 MSN Messenger 與朋友交換照片、喜愛的音樂或任何其他文件,也可以監(jiān)視新的電子郵件并查看用戶有多少新的</p><p>  1.3本課題研究的意義</p><p>  在當今信息時代,信息通信已成為這個世紀必不可少的組成部分,隨著互聯(lián)網(wǎng)技術的發(fā)展,聊天軟件作為

24、即時性通信工具的主流,已被越來越多的人所喜愛。在中國,上網(wǎng)的用戶幾乎都用騰訊QQ進行聊天。當前騰訊QQ的注冊帳戶已經(jīng)超過4.3億,是中國用戶最多、最為流行的聊天工具。起初的QQ只支持文字聊天,隨著相關技術的發(fā)展,騰訊QQ也不斷的自我完善,增加眾多實用的、人性化的功能,得到了許多用戶的支持與喜愛?,F(xiàn)如今騰訊公司已經(jīng)初步完成了面向在線生活產(chǎn)業(yè)模式的業(yè)務布局:構建了QQ、QQ.com、QQ游戲以及QQ移動手機門戶這四大網(wǎng)絡平臺,形成了規(guī)模巨大

25、的網(wǎng)絡社區(qū)。在滿足用戶信息傳遞與知識獲取需求方面,擁有QQ.Com門戶、QQ即時通訊工具以及年初收購的Foxmail電子郵件等;在滿足用戶群體交流和資源共享方面,騰訊推出的個人博客Q-Zone將與訪問量極大的論壇、聊天室、QQ群相互協(xié)同;在滿足用戶個性展示和娛樂服務方面,騰訊擁有非常成功的虛擬形象產(chǎn)品QQshow、QQpet(寵物)和QQGame(游戲)QQMusic/Radio/LiveTV(音樂/電臺/電視直播)等,另外對手機用戶提

26、供了彩鈴、彩信等無線增值業(yè)務</p><p>  第二章 理論知識介紹</p><p>  2.1 C++語言的介紹</p><p>  C++語言是一種優(yōu)秀的面向對象程序設計語言,它在C語言的基礎上發(fā)展而來,但它比C語言更容易為人們學習和掌握。C++以其獨特的語言機制在計算機科學的各個領域中得到了廣泛的應用。面向對象的設計思想是在原來結構化程序設計方法基礎上的一

27、個質的飛躍,C++完美地體現(xiàn)了面向對象的各種特性[5]。</p><p> ?。?)C++支持數(shù)據(jù)封裝 </p><p>  支持數(shù)據(jù)封裝就是支持數(shù)據(jù)抽象。在C++中,類是支持數(shù)據(jù)封裝的工具,對象則是數(shù)據(jù)封裝的實現(xiàn)。面向過程的程序設計方法與面向對象的程序設計方法在對待數(shù)據(jù)和函數(shù)關系上是不同的,在面向對象的程序設計中,將數(shù)據(jù)和對該數(shù)據(jù)進行合法操作的函數(shù)封裝在一起作為一個類的定義,數(shù)據(jù)將被隱藏

28、在封裝體中,該封裝體通過操作接口與外界交換信息。對象被說明具有一個給定類的變量,類類似于C語言中的結構,在C語言中可以定義結構,但這種結構中包含數(shù)據(jù),而不包含函數(shù)。C++中的類是數(shù)據(jù)和函數(shù)的封裝體。在C++中,結構可作為一種特殊的類,它雖然可以包含函數(shù),但是它沒有私有或保護的成員。 (2)C++類中包含私有、公有和保護成員 C++類中可定義三種不同訪控制權限的成員。一種是私有(Private)成員,只有在類中說明的函數(shù)

29、才能訪問該類的私有成員,而在該類外的函數(shù)不可以訪問私有成員;另一種是公有(Public)成員,類外面也可訪問公有成員,成為該類的接口;還有一種是保護(Protected)成員,這種成員只有該類的派生類可以訪問,其余的在這個類外不能訪問。 (3)C++中通過發(fā)關消息來處理對象 </p><p> ?。?)C++允許函數(shù)名和運算符重載 </p><p>  C++支持多態(tài)性,

30、C++允許一個相同的標識符或運算符代表多個不同實現(xiàn)的函數(shù),這就稱標識符或運算符的重載,用戶可以根據(jù)需要定義標識符重載或運算符重載。 (6)C++支持繼承性 C++中可以允許單繼承和多繼承。一個類可以根據(jù)需要生成派生類。派生類繼承了基類的所有方法,另外派生類自身還可以定義所需要的不包含在父類中的新方法。一個子類的每個對象包含有從父類那里繼承來的數(shù)據(jù)成員以及自己所特有的數(shù)據(jù)成員。 (7)C++支持動態(tài)聯(lián)編

31、 C++中可以定義虛函數(shù),通過定義虛函數(shù)來支持動態(tài)聯(lián)編[4]。</p><p><b>  2.2 VFW簡介</b></p><p>  VFW是Microsoft 1992年推出的關于數(shù)字視頻的一個軟件包,它能使應用程序數(shù)字化并播放從傳統(tǒng)模擬視頻源得到的視頻剪輯。VFW的一個關鍵思想是播放時不需要專用硬件,為了解決數(shù)字視頻數(shù)據(jù)量大的問題,需要對數(shù)據(jù)進行壓縮。它引進

32、了一種叫AVI的文件標準,該標準未規(guī)定如何對視頻進行捕獲、壓縮及播放,僅規(guī)定視頻和音頻該如何存儲在硬盤上,以及在AVI文件中交替存儲視頻幀和與之相匹配的音頻數(shù)據(jù)。VFW給程序員提供VBX和AVICap窗口類的高級編程工具,使程序員能通過發(fā)送消息或設置屬性來捕獲、播放和編輯視頻剪輯。用戶不必專門安裝VFW,在安裝Windows時,安裝程序會自動地安裝配置視頻所需的組件,如設備驅動程序、視頻壓縮程序等[6]。</p><

33、p>  VFW主要由以下六個模塊組成:</p><p> ?。?)AVICAP.DLL:包含了執(zhí)行視頻捕獲的函數(shù),它給AVI文件、I/O和視頻音頻設備驅動程序提供一個高級接口。</p><p> ?。?)MSVIDEO.DLL:用一套特殊的DrawDib函數(shù)來處理屏幕上的視頻操作。</p><p>  (3)MCIAVI.DRV:此驅動程序包括對VFW的MCI

34、命令的解釋器。</p><p> ?。?)AVIFILE.DLL:支持由標準多媒體I/O(mmio)函數(shù)提供的更高的命令來訪問AVI文件。</p><p> ?。?)壓縮管理器(ICM):管理用于視頻壓縮/解壓縮的編解碼器(CODEC)。</p><p>  (6)音頻壓縮管理器ACM:提供與ICM相似的服務,不同的是它適于波形音頻。</p><

35、p>  Visual C++在支持VFW方面提供有vfw32.lib、msacm32.lib、winmm.lib等庫。特別是它提供了功能強大、簡單易行、類似于MCIWnd的窗口類AVICap。AVICap為應用程序提供了一個簡單的、基于消息的接口,使之能訪問視頻和波形音頻硬件,并能在將視頻流捕獲到硬盤上的過程中進行控制。</p><p>  AVICap支持實時的視頻流捕獲和單幀捕獲,并提供對視頻源的控制。

36、雖然MCI也提供數(shù)字視頻服務,比如,它為顯示AVI文件的視頻提供了AVIVideo命令集,為視頻疊加提供了overlay命令集,但這些命令主要是基于文件的操作,不能滿足實時地直接從視頻緩存中獲取數(shù)據(jù)的要求。對于使用沒有視頻疊加能力的捕獲卡的PC機來說,用MCI提供的命令集是無法捕獲視頻流的。而AVICap在捕獲視頻方面具有一定的優(yōu)勢,它能直接訪問視頻緩沖區(qū),不需要生成中間文件,實時性很強,效率很高。同時,它也可將數(shù)字視頻捕獲到文件。&l

37、t;/p><p>  在視頻捕獲之前需要創(chuàng)建一個捕獲窗,所有的捕獲操作及其設置都以它為基礎。用AVICap窗口類創(chuàng)建的窗口(通過capCreateCaptureWindow函數(shù)創(chuàng)建)被稱為“捕獲窗”,其窗口風格一般為WS_CHILD和WS_VISIBLE。實際上,捕獲窗類似于標準控制(如按鈕、列表框等)。捕獲窗具有下列功能:</p><p> ?。?)將視頻流和音頻流捕獲到一個AVI文件中;&

38、lt;/p><p> ?。?)動態(tài)地同視頻和音頻輸入器件連接或斷開;</p><p> ?。?)以Overlay或Preview模式對輸入的視頻流進行實時顯示;</p><p> ?。?)在捕獲時可指定所用的文件名并能將捕獲文件的內(nèi)容拷貝到另一個文件;</p><p> ?。?)設置捕獲速率;</p><p> ?。?)顯

39、示控制視頻源、視頻格式、視頻壓縮的對話框;</p><p> ?。?)創(chuàng)建、保存或載入調色板;</p><p> ?。?)將圖像和相關的調色板拷貝到剪貼板;</p><p> ?。?)將捕獲的一個單幀圖像保存為DIB格式的文件。</p><p>  AVICap在顯示視頻時提供的兩種模式:</p><p> ?。?)預

40、覽(Preview)模式:該模式使用CPU資源,視頻幀先從捕獲硬件傳到系統(tǒng)內(nèi)存,接著采用GDI函數(shù)在捕獲窗中顯示。在物理上,這種模式需要通過VGA卡在監(jiān)視器上顯示。</p><p> ?。?)疊加(Overlay)模式:該模式使用硬件疊加進行視頻顯示,疊加視頻的顯示不經(jīng)過VGA卡,疊加視頻的硬件將VGA的輸出信號與其自身的輸出信號合并,形成組合信號顯示在計算機的監(jiān)視器上。只有部分視頻捕獲卡才具有視頻疊加能力。&l

41、t;/p><p>  靈活編寫AVICap提供的回調函數(shù)還可滿足一些特殊需求。比如,將宏capCaptureSequenceNoFile同用capSetCallbackOnVideoStream登記的回調函數(shù)一起使用,可使應用程序直接使用視頻和音頻數(shù)據(jù)。在視頻聊天的應用程序中可利用這一點來獲得視頻幀,回調函數(shù)將捕獲的圖像傳到遠端的計算機。應用程序可用捕獲窗來登記回調函數(shù)(由用戶編寫,而由系統(tǒng)調用),以便在發(fā)生下列情況

42、時,它能通知應用程序,作出相應的反應:捕獲窗狀態(tài)改變;出錯;視頻幀和音頻緩存可以使用;在捕獲過程中,其它應用程序處于讓步(Yield)地位。</p><p>  視頻捕獲編程也要用到涉及視頻捕獲的結構、宏、消息和函數(shù)。令人高興的是,發(fā)送AVICap窗口消息所能完成的功能都能調用相應的宏來完成。例如,SendMessage(hWndCap,WM_CAP_DRIVER_CONNECT,0,0L)與capDriverC

43、onnect(hWndCap,0)的作用相同,都是將創(chuàng)建的捕獲窗同視頻輸入器件連接起來。</p><p>  視頻部分主要是利用Video Capture函數(shù)庫來獲取影像的。Video Capture主要提供下列功能:連接驅動程序;獲取影像、聲音資料,并顯示在屏幕上或者是存成AVI文件;獲取單張影像顯示在屏幕上,拷貝至剪貼簿,或者是存成DIB(Device-Independent Bitmap)文件。</p

44、><p>  Video Capture的主要結構:</p><p>  結構體CAPTUREPARAMS主要包含一些獲取圖像的參數(shù):DWORD dwRequestMicroSecPerFrame代表相鄰兩個frame的獲取時間間隔;BOOL fYield值為TRUE,則表示W(wǎng)indows會以另一個thread來捕獲影像,值為FALSE,程序會在捕捉影像后顯示忙碌狀態(tài);BOOL fCaptur

45、eAudio其值表示是否需要同時獲取聲音資料。</p><p>  結構體BITMAPINFO和點陣圖有關,主要定義了影像獲取之后顯示在屏幕上、存儲在文件中的格式,它包含兩個成員:BITMAPINFOHEADER bmiHeader描述影像性質的結構,其成員記載了影像的大小、顏色深度和壓縮的方式,該成員在Video Capture、Video Compression Manager和DrawDib函數(shù)庫中,以及有

46、關于點陣圖的應用中;RGBQUAD bmiColors指向color table第一個元素的位置。</p><p>  結構體COMPVARS主要是記錄所有和壓縮相關的信息,重要的成員:DWORD fccHandler為compressor句柄;LPBITMAPINFO lpbiIn指向待壓縮影像BITMAPINFO的指標;LPBITMAPINFO lpbitOut:指向壓縮完影像BITMAPINFO的指標;LO

47、NG lKey代表key-frame rate,而所謂key frame是指此frame在解壓縮時不需要依賴前面的frame;LONG lQ代表影像壓縮后的品質,取值為1~10000的整數(shù)。</p><p>  Video Compression Functions主要記錄壓縮功能相關的信息,其包含的比較重要的成員:ICLocate輸入指向壓縮前后BITMAPINFO的指標,以及欲使用的codecs;ICComp

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

49、pressQuery詢問decompressor是否支持某種解壓縮方式;ICDompressBegin要求系統(tǒng)準備相關資源以供解壓縮之用;ICDompress解壓縮某一個frame;ICDompressEnd歸還相關資源給系統(tǒng);ICDompressFree歸還COMPVARS所占用的資源[3]。 </p><p>  2.3 C/S結構的介紹</p><p>  C/S(client/se

50、rver)結構,即被廣為熟知和使用的客戶機和服務器結構。它是軟件系統(tǒng)體系結構,通過它可以充分利用兩端硬件環(huán)境的優(yōu)勢,將任務合理分配到client端和server端來實現(xiàn),降低了系統(tǒng)的通訊開銷。目前大多數(shù)應用軟件系統(tǒng)都是client/server形式的兩層結構,由于現(xiàn)在的軟件應用系統(tǒng)正在向分布式的web應用發(fā)展,web和client/server應用都可以進行同樣的業(yè)務處理,應用不同的模塊共享邏輯組件;因此,內(nèi)部用戶和外部用戶都可以訪問新

51、的和現(xiàn)有的應用系統(tǒng),通過現(xiàn)有應用系統(tǒng)中的邏輯可以擴展出新的應用系統(tǒng)。這也就是目前應用系統(tǒng)的發(fā)展方向。傳統(tǒng)的c/s體系結構雖然采用的是開放模式,但這只是系統(tǒng)開發(fā)一級的開放性,在特定的應用中無論是client端還是server端都還需要特定的軟件支持。由于沒能提供用戶真正期望的開放環(huán)境,c/s結構的軟件需要針對不同的操作系統(tǒng)開發(fā)不同版本的軟件,加之產(chǎn)品的更新?lián)Q代十分快,已經(jīng)很難適應百臺電腦以上局域網(wǎng)用戶同時使用。而且代價高,效率低。<

52、/p><p>  C/S架構軟件的優(yōu)勢與劣勢:</p><p> ?。?)應用服務器運行數(shù)據(jù)負荷較輕。最簡單的C/S體系結構的數(shù)據(jù)庫應用由兩部分組成,即客戶應用程序和數(shù)據(jù)庫服務器程序。二者可分別稱為前臺程序與后臺程序。運行數(shù)據(jù)庫服務器程序的機器,也稱為應用服務器。一旦服務器程序被啟動,就隨時等待響應客戶程序發(fā)來的請求;客戶應用程序運行在用戶自己的電腦上,對應于數(shù)據(jù)庫服務器,可稱為客戶電腦,當需

53、要對數(shù)據(jù)庫中的數(shù)據(jù)進行任何操作時,客戶程序就自動地尋找服務器程序,并向其發(fā)出請求,服務器程序根據(jù)預定的規(guī)則作出應答,送回結果,應用服務器運行數(shù)據(jù)負荷較輕。</p><p> ?。?)數(shù)據(jù)的儲存管理功能較為透明。在數(shù)據(jù)庫應用中,數(shù)據(jù)的儲存管理功能,是由服務器程序和客戶應用程序分別獨立進行的,前臺應用可以違反的規(guī)則,并且通常把那些不同的(不管是已知還是未知的)運行數(shù)據(jù),在服務器程序中不集中實現(xiàn),例如訪問者的權限,編號

54、可以重復、必須有客戶才能建立定單這樣的規(guī)則。所有這些,對于工作在前臺程序上的最終用戶,是“透明”的,他們無須過問(通常也無法干涉)背后的過程,就可以完成自己的一切工作。在客戶服務器架構的應用中,前臺程序不是非?!笆菪 保闊┑氖虑槎冀唤o了服務器和網(wǎng)絡。在C/S體系的下,數(shù)據(jù)庫不能真正成為公共、專業(yè)化的倉庫,它受到獨立的專門管理。</p><p>  (3)C/S架構的劣勢是高昂的維護成本且投資大。首先,采用C/S

55、架構,要選擇適當?shù)臄?shù)據(jù)庫平臺來實現(xiàn)數(shù)據(jù)庫數(shù)據(jù)的真正“統(tǒng)一”,使分布于兩地的數(shù)據(jù)同步完全交由數(shù)據(jù)庫系統(tǒng)去管理,但邏輯上兩地的操作者要直接訪問同一個數(shù)據(jù)庫才能有效實現(xiàn),有這樣一些問題,如果需要建立“實時”的數(shù)據(jù)同步,就必須在兩地間建立實時的通訊連接,保持兩地的數(shù)據(jù)庫服務器在線運行,網(wǎng)絡管理工作人員既要對服務器維護管理,又要對客戶端維護和管理,這需要高昂的投資和復雜的技術支持,維護成本很高,維護任務量大[11]。</p><

56、;p>  2.4線程的實現(xiàn)方法</p><p>  線程是一個獨立的執(zhí)行流,是進程內(nèi)部的一個獨立的執(zhí)行單元,相當于一個子程序,它對應于Visual C++中的CWinThread類對象。單獨一個執(zhí)行程序運行時,缺省地包含了一個主線程,主線程以函數(shù)地址的形式出現(xiàn),提供程序的啟動點,當主線程終止時,進程也隨之終止。根據(jù)實際需要,應用程序可以分解成許多獨立執(zhí)行的線程,每個線程并行的運行在同一進程中。</p&

57、gt;<p>  一個進程中的所有線程都在該進程的虛擬地址空間中,使用該進程的全局變量和系統(tǒng)資源。操作系統(tǒng)給每個線程分配不同的CPU時間片,在某一個時刻,CPU只執(zhí)行一個時間片內(nèi)的線程,多個時間片中的相應線程在CPU內(nèi)輪流執(zhí)行,由于每個時間片時間很短,所以對用戶來說,仿佛各個線程在計算機中是并行處理的。操作系統(tǒng)是根據(jù)線程的優(yōu)先級來安排CPU的時間,優(yōu)先級高的線程優(yōu)先運行,優(yōu)先級低的線程則繼續(xù)等待。</p>&

58、lt;p>  Windows提供了兩種線程:用戶界面線程和工作線程(又稱為后臺線程)。用戶界面線程通常用來處理用戶的輸入并響應各種事件和消息,其實,應用程序的主執(zhí)行線程CWinApp對象就是一個用戶界面線程,當應用程序啟動時自動創(chuàng)建和啟動,同樣它的終止也意味著該程序的結束,進程終止。工作線程用來執(zhí)行程序的后臺處理任務,比如計算、調度、對串口的讀寫操作等,它和用戶界面線程的區(qū)別是它不用從CWinThread類派生來創(chuàng)建,對它來說最重

59、要的是如何實現(xiàn)工作線程任務的運行控制函數(shù)。工作線程和用戶界面線程啟動時要調用同一個函數(shù)的不同版本;一個進程中的所有線程共享它們父進程的變量,但同時每個線程可以擁有自己的變量[7]。</p><p>  這里主要介紹用戶界面線程的運用:</p><p><b> ?。?)線程的啟動</b></p><p>  創(chuàng)建一個用戶界面線程,首先要從類Cw

60、inThread產(chǎn)生一個派生類,同時必須使DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE來聲明和實現(xiàn)這個CwinThread派生類。第二步是根據(jù)需要重載該派生類的一些成員函數(shù)如:ExitInstance()、InitInstance()、OnIdle()、PreTranslateMessage()等函數(shù)。最后調用AfxBeginThread()函數(shù)的一個版本:CWinThread* AfxBeginThrea

61、d (CRuntimeClass* pThreadClass,int nPriority=THREAD_PRIORITY_NORMAL,UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL)啟動該用戶界面線程,其中第一個參數(shù)為指向定義的用戶界面線程類指針變量,第二個參數(shù)為線程的優(yōu)先級,第三個參數(shù)為線程所對應的堆

62、棧大小,第四個參數(shù)為線程創(chuàng)建時的附加標志,缺省為正常狀態(tài),如為CREATE_SUSP</p><p><b>  (2)線程的優(yōu)先級</b></p><p>  CwinThread類的成員函數(shù)用于線程優(yōu)先級的操作:</p><p>  int GetThreadPriority();</p><p>  BOOL Se

63、tThradPriority()(int nPriority);</p><p>  (3)線程的掛起和恢復</p><p>  CWinThread類中包含了應用程序掛起和恢復它所創(chuàng)建的線程的函數(shù),其中SuspendThread()用來掛起線程,暫停線程的執(zhí)行;ResumeThread()用來恢復線程的執(zhí)行。如果你對一個線程連續(xù)若干次執(zhí)行SuspendThread(),則需要連續(xù)執(zhí)行相應

64、次的ResumeThread()來恢復線程的運行。</p><p><b> ?。?)結束線程</b></p><p>  終止線程有三種途徑,線程可以在自身內(nèi)部調用AfxEndThread()來終止自身的運行;可以在線程的外部調用BOOL TerminateThread(HANDLE hThread, DWORD dwExitCode)來強行終止一個線程的運行,然后

65、調用CloseHandle()函數(shù)釋放線程所占用的堆棧;第三種方法是改變?nèi)肿兞?,使線程的執(zhí)行函數(shù)返回,則該線程終止。</p><p><b>  第三章 需求分析</b></p><p><b>  3.1軟硬件環(huán)境</b></p><p>  電腦兩臺以上,分別配有攝像頭、麥克風、音箱或耳機等外部設備;Windows

66、 XP系統(tǒng),Microsoft Visual Studio 6.0編程開發(fā)系統(tǒng)等。</p><p><b>  3.2需求分析</b></p><p>  在同一個局域網(wǎng)中,如何根據(jù)自身業(yè)務的要求,量身定制,對視頻設備進行合理搭配,選擇一套合理的視頻聊天室系統(tǒng)。如何來滿足局域網(wǎng)內(nèi)部用戶的通訊要求,在考慮到網(wǎng)絡帶寬的同時,提高視頻清晰度,動態(tài)畫面的流暢,語音的實時傳輸?shù)?/p>

67、,正是現(xiàn)代社會通訊所必需的。設計本系統(tǒng)時,分析網(wǎng)絡承載、整個系統(tǒng)結構的組建等是實現(xiàn)局域網(wǎng)文字聊天和語音視頻聊天所必需的。</p><p>  文字、語音視頻聊天作為一種廣泛的網(wǎng)絡應用對其基礎的承載網(wǎng)絡環(huán)境有著較高的網(wǎng)絡要求。其中應重點考慮的是網(wǎng)絡的帶寬情況、端到端的時延、時延抖動、丟包率等問題。</p><p> ?。?)網(wǎng)絡帶寬需求,視頻聊天對網(wǎng)絡的帶寬需求為“視頻帶寬+IP包頭開銷”,

68、計算方法為:網(wǎng)絡帶寬 = 視頻帶寬 × 1.2。</p><p>  (2)端到端的時延,網(wǎng)絡傳輸不可避免的會發(fā)生傳輸時延,通常建議視頻聊天的通用時延小于150ms。</p><p> ?。?)時延抖動,由于音頻/視頻的傳輸為實時的交互,因此網(wǎng)絡的時延抖動更為重要,一般,視頻聊天的時延抖動控制在50ms內(nèi)。</p><p> ?。?)丟包率,網(wǎng)絡數(shù)據(jù)傳輸經(jīng)

69、常會出現(xiàn)丟包現(xiàn)象,視頻傳輸過程中數(shù)據(jù)丟包嚴重的話會影響在線視頻聊天質量。因此,在設計上應將網(wǎng)絡上的丟包率控制在1%以內(nèi)。</p><p>  視頻聊天對實時性要求較高的網(wǎng)絡應用,作為其基礎的承載網(wǎng)絡有較高的寬帶和對網(wǎng)絡中的業(yè)務流量有較高的控制能力。而視頻聊天系統(tǒng)本身對帶寬的要求為62kbit/s~2Mbit/s,但是為了滿足流暢的視音頻效果,要求帶寬不低于384kbit/s。</p><p&g

70、t;  文字、視頻聊天的功能和應用效果體現(xiàn)在客戶端,而服務器端則是必不可少的,對于系統(tǒng)的需求分析在系統(tǒng)設計的過程中應該明確、細致:</p><p> ?。?)文字聊天:首先啟動服務器端,當用戶啟動客戶端時,用服務器保存的用戶名和密碼來驗證客戶是否已經(jīng)登錄到服務器。只有當有兩個以上的用戶啟動客戶端時,才可以進行文字聊天,聊天內(nèi)容要經(jīng)過服務器中轉,分別在服務器端和兩個聊天的客戶端顯示聊天。</p>&l

71、t;p>  (2)語音視頻聊天:在有兩個客戶在線的情況下,才能進行語音視頻聊天。兩個用戶要進行語音視頻聊天時,一個用戶選中另一個用戶的用戶名,根據(jù)該用戶名在后臺鏈表中的對應IP地址查找用戶并請求視頻連接。當雙方確認視頻連接后就進行視頻傳輸,并顯示在客戶端,同時用線程實現(xiàn)語音錄制和回放。這樣,兩個用戶就實現(xiàn)了點對點的語音視頻聊天。在進行語音視頻聊天的過程中,不能再與其它用戶進行語音視頻聊天,但能夠與其它用戶進行文字聊天。</p

72、><p><b>  第四章 系統(tǒng)結構</b></p><p><b>  4.1硬件結構</b></p><p>  該系統(tǒng)采用的是Server/Client結構,服務器端是一臺PC機,而客戶端是PC機和一個數(shù)字攝像頭、耳機和麥克風。它們進行文字聊天時,要經(jīng)過服務器進行中轉,而當進行語音視頻聊天時是客戶端與客戶端之間直接進

73、行的點對點的連接,它們之間的網(wǎng)絡拓撲結構如圖1。在圖中,為了簡便,沒有畫出麥克風、音箱或耳機等外部設備。</p><p>  圖1 網(wǎng)絡拓撲結構圖</p><p><b>  4.2軟件結構</b></p><p><b>  4.2.1功能需求</b></p><p>  通過需求調研并分析,確定

74、系統(tǒng)具備的基本功能,包括:文字聊天、語音視頻聊天。</p><p><b> ?。?)文字聊天:</b></p><p>  文字聊天采用的是TCP模式,包括服務器端和客戶端。首先啟動服務器端,客戶端通過用戶名和密碼登錄服務器,服務器響應客戶端登錄并提示有用戶登錄,此時兩個用戶就可以進行文字聊天,在文字聊天時通過服務器中轉,而每個用戶可以同時與多個用戶進行文字聊天。當

75、有用戶退出時,服務器做出響應,提示在線用戶,××用戶下線。</p><p> ?。?)語音視頻聊天:</p><p>  語音視頻聊天時采用的是UCP模式,客戶端與客戶端點對點的進行,不需要經(jīng)過服務器端中轉。在文字聊天的基礎上,客戶端之間自行處理的語音視頻聊天,運用VFW函數(shù)庫中的函數(shù)對USB口輸入的數(shù)字視頻信息進行相關處理,比如:視頻捕獲、影像壓縮以及影像播放等,同時

76、利用線程來處理聲音部分的錄制、回放等。A客戶端向B客戶端請求語音視頻聊天是通過B客戶端的用戶名來獲得B客戶端的IP地址,并向B客戶端發(fā)送語音視頻聊天請求,當B客戶端接受后捕獲視頻,并進行壓縮傳輸?shù)紸客戶端解壓并進行顯示,在B客戶端接受視頻的同時,A客戶端也捕獲視頻,壓縮傳輸?shù)紹客戶端解壓并進行顯示。</p><p>  4.2.2系統(tǒng)功能模塊圖</p><p>  該系統(tǒng)分為服務器端和客戶

77、端,完成了文字聊天和語音視頻聊天,使用上只有文字聊天時才會通過服務器端,而對于語音視頻聊天就只需要對整個在線客戶端兩兩之間進行點對點的視頻聊天。而在語音視頻時包括了視頻捕獲、視頻壓縮、解壓縮、語音錄制、語音回放以及視頻傳輸?shù)取U麄€系統(tǒng)的功能模塊圖如圖2。</p><p>  圖2 系統(tǒng)功能模塊圖</p><p>  4.3系統(tǒng)各模塊流程圖</p><p>  在整個

78、系統(tǒng)中主要運行兩個功能:圖3 文字聊天流程圖和圖4 語音視頻聊天流程圖。</p><p>  圖3 文字聊天流程圖</p><p>  圖4 語音視頻聊天流程圖</p><p>  第五章 系統(tǒng)的詳細設計</p><p><b>  5.1文字聊天</b></p><p>  5.1.1 TCP套

79、接字的運用</p><p>  在文字聊天時,服務器端與客戶端的連接是采用的TCP套接節(jié)進行連接。TCP套接字的使用如圖5。創(chuàng)建CSocket對象CSocketServer來處理服務器端與客戶端的連接,CSocket繼承于CasyncSocket,是Windows Socket API的高層抽象。CSocket通常和CsocketFile以及Carchive類混合使用,這兩個類負責數(shù)據(jù)的發(fā)送和接收。要使用CSoc

80、ket對象,首先要調用構造函數(shù),然后調用Create函數(shù)創(chuàng)建一個Socket句柄。CSocket函數(shù)缺省是創(chuàng)建一個流Socket;如果沒有使用CArchive類,那么還可以創(chuàng)建一個數(shù)據(jù)報Socket。服務器端調用Accept,客戶端調用Connect,然后創(chuàng)建一個CsocketFile去關聯(lián)CSocket。接下來的操作可以創(chuàng)建CArchive對象關聯(lián)CsocketFile,以用來發(fā)送和接收數(shù)據(jù)[2]。</p><p&

81、gt;  圖5 TCP套接字的使用</p><p>  5.1.2 文字聊天實現(xiàn)</p><p>  ChatServer服務器運行時,利用一個CSocket對象CSocketServer啟動服務器,用函數(shù)gethostname來獲得服務器端主機名和IP,同時在服務器對話框中顯示服務器IP,并將分配的固定端口號8123顯示在對話框中。用一個list列表顯示在線用戶,隨時更新用戶登錄情況,用

82、一個edit box顯示客戶端的聊天內(nèi)容以及系統(tǒng)提示消息。每一個ChatClient客戶端啟動時,利用服務器內(nèi)定的用戶號和密碼來登錄(如圖6)。在整個系統(tǒng)中,利用鏈表來處理所有的用戶信息:當有用戶登錄時,在鏈表尾部加入該用戶信息;當用戶下線時,在該鏈表中刪除用戶,并提示所有用戶,該用戶下線。在對鏈表進行操作的同時,要更新list列表中的信息。</p><p><b>  圖6 用戶登錄界面</b&

83、gt;</p><p>  ChatServer服務器端響應客戶端文字聊天時的中轉情況如圖7。</p><p>  圖7 服務器響應文字聊天信息中轉</p><p>  ChatClient客戶端兩兩間進行文字聊天時,發(fā)送信息的處理函數(shù)如下:</p><p>  void CChatClientDlg::OnChatBtSend() /

84、/發(fā)送信息按鍵</p><p><b>  {</b></p><p>  if( !m_bConnect)</p><p><b>  {</b></p><p>  SetMessageBox("請連接服務器!\r\n");</p><p><b

85、>  return ;</b></p><p><b>  }</b></p><p>  CString str;</p><p>  CString szUserName;</p><p>  CMesg msg;</p><p>  GetDlgItemText(IDC_M

86、ESSAGE,str);</p><p>  GetDlgItemText(IDC_USERNAME,szUserName);</p><p>  if( str.GetLength() <= 0 )</p><p><b>  {</b></p><p>  SetMessageBox("請輸入想要發(fā)送

87、的信息!\r\n");</p><p><b>  return ;</b></p><p><b>  }</b></p><p>  if ( szUserName.GetLength() <= 0)</p><p><b>  {</b></p>

88、;<p>  SetMessageBox("請選擇說話對象!\r\n");</p><p><b>  return ;</b></p><p><b>  }</b></p><p><b>  //消息封裝</b></p><p>  ms

89、g.m_szCommand.Format("Message");</p><p>  msg.m_szRecObject.Format(szUserName);</p><p>  msg.m_szText.Format(str);</p><p>  m_csClient->SendM(&msg);</p><

90、p>  AddReceiver(szUserName , true);</p><p>  AddChatMessage(str);</p><p><b>  }</b></p><p>  在聊天兩個客戶端的信息情況如圖8和圖9所示。</p><p><b>  圖8 發(fā)送文字信息</b>

91、</p><p><b>  圖9 接收文字信息</b></p><p><b>  5.2語音視頻聊天</b></p><p>  5.2.1 UDP套接字的運用</p><p>  在實現(xiàn)語音視頻聊天時,采用的是基于UDP套接字的點對點模式,而UDP面向的是無連接的數(shù)據(jù)服務,其套接字的使用如圖1

92、0所示。</p><p>  圖10 UDP套接字的使用</p><p>  5.2.2視頻的捕獲</p><p>  利用VFW接口,視頻捕獲可以分為以下幾個步驟:</p><p>  (1)建立視頻采集窗口:該窗口用來接收視頻捕捉驅動程序傳來的數(shù)據(jù)和消息。</p><p> ?。?)連接視頻驅動程序:將建立的視頻捕

93、捉窗口與視頻設備驅動程序相連。</p><p>  (3)視頻捕獲初始化。</p><p> ?。?)視頻捕捉設置:VFW下視頻捕捉參數(shù)的設置可以通過調用函數(shù)或彈出對話框的形式來實現(xiàn)。一般視頻驅動程序允許設置的參數(shù)包括視頻源選擇、視頻格式、視頻顯示格式等。</p><p>  (5)設置回調函數(shù):通過回調函數(shù)來通知程序視頻事件的發(fā)生,比如捕捉一幀圖像成功的消息,捕捉

94、出錯的消息等。</p><p>  (6)結束捕捉:結束捕捉是應該有一些清除工作。如釋放分配的內(nèi)存,斷開捕捉窗口與視頻捕捉驅動程序的連接,清除視頻捕捉窗口等。</p><p>  窗口類為捕獲數(shù)字視頻流及其相關操作提供了很大的方便,靈活編寫其中的回調函數(shù)可滿足實時視頻傳輸?shù)男枰?,例如應用程序可直接從緩沖中取得數(shù)字視頻并對其進行壓縮編碼后實時地傳到遠端的客戶端。</p><

95、;p>  在VC++中,采用VFW技術,客戶端通過capSetCallbackOnFrame()注冊回調函數(shù),當采集卡采集到一幅圖像后,系統(tǒng)就會自動調用回調函數(shù),然后再回調函數(shù)中使用ICSeqCompressFrame()函數(shù)進行壓縮。然后再通過Winsock將壓縮后的數(shù)據(jù)發(fā)送到另一客戶端。該客戶端接收完一幀以后,交給ICDecompress()解壓,最后用SetDIBitsToDevice()將圖像顯示出來。</p>

96、<p>  基本的捕獲設置包括設置捕獲速度(每秒捕獲多少幀)、是否同時捕獲聲頻、捕獲緩沖、允許最大丟失多少幀和是否使用DOS內(nèi)存,以及使用鍵盤的哪個鍵或鼠標的哪個鍵來終止捕獲等內(nèi)容,這些設置使用CAPTUREPARAMS結構來描述,capCaptureGetSetup宏來得到當前的設置,然后改變此結構的成員變量,再使用capCaptureSetSetup宏設置新的設置。</p><p>  設置捕獲

97、速度,通過使用capCaptureGetSetup宏來得到當前的捕捉速度,將當前的捕捉速度保存在CAPTUREPARAMS結構的dwRequestMicroSecPerFrame成員變量中,也可以通過設置此變量來改變當前設置值。</p><p>  設置終止捕獲,同樣通過使用capCaptureGetSetup宏來得到當前的設置,當前按鍵設置保存在CAPTUREPARAMS結構的vKeyAbort成員中,鼠標設置

98、保存在fAbortLeftMouse和fAbortRightMouse成員中,通過修改可以設置新的熱健或者鼠標左右鍵,修改完成后,使用capCaptureSetSetup宏來進行更新。</p><p>  捕獲的時間限制,用CAPTUREPARAMS結構中的fLimitEnabled表示捕獲是否有時間的限制,wTimeLimit用來設置指示捕獲最大的持續(xù)時間,其單位為秒。使用capCaptureGetSetup宏

99、來得到當前的設置值。</p><p>  下面程序為設置CAPTUREPARAMS結構的實現(xiàn)代碼:</p><p>  BOOL VideoCapture::SetCapturePara()</p><p><b>  {</b></p><p>  CAPTUREPARMS CapParms={0};</p&g

100、t;<p>  capCaptureGetSetup(m_capwnd,&CapParms,sizeof(CapParms));</p><p>  //得到當前的捕獲速度</p><p>  CapParms.fAbortLeftMouse = FALSE;</p><p>  CapParms.fAbortRightMouse = FALS

101、E;</p><p>  CapParms.fYield = TRUE;</p><p>  CapParms.fCaptureAudio = FALSE;</p><p>  CapParms.wPercentDropForError = 80;</p><p>  if(!capCaptureSetSetup(m_capwnd,&

102、CapParms,sizeof(CapParms)))</p><p><b>  {</b></p><p>  //log.WriteString("\n Failed to set the capture parameters ");</p><p>  return FALSE;</p><p&

103、gt;<b>  }</b></p><p>  // Set Video Format </p><p>  capGetVideoFormat(m_capwnd,&m_bmpinfo,sizeof(m_bmpinfo));</p><p>  m_bmpinfo.bmiHeader.biWidth=IMAGE_WIDTH;</

104、p><p>  m_bmpinfo.bmiHeader.biHeight=IMAGE_HEIGHT;</p><p>  BOOL ret=capSetVideoFormat(m_capwnd,&m_bmpinfo,sizeof(m_bmpinfo));</p><p>  //log.WriteString("\n Video parameters

105、 set properly");</p><p>  return ret;</p><p><b>  }</b></p><p>  //終止一個捕獲任務</p><p>  BOOL VideoCapture::StopCapture()</p><p><b>  {&

106、lt;/b></p><p>  capCaptureStop(m_capwnd);</p><p>  capCaptureAbort(m_capwnd);</p><p>  Sleep(500);</p><p>  return TRUE;</p><p><b>  }</b>&

107、lt;/p><p><b>  5.2.3捕獲窗口</b></p><p>  在捕獲前必須創(chuàng)建一個捕獲窗口(Capture Widnow),下面介紹有關捕獲窗口的情況:創(chuàng)建一個AVICap捕獲窗口,用capCreateCaptureWindow函數(shù)并返回一個句柄。將捕獲窗口連接至捕獲設備,用capDriverConnect函數(shù)來使一個捕獲窗口與一個捕獲設備連接或關聯(lián)連接

108、上后,就可以通過捕獲窗口向捕獲設備發(fā)送各種消息,可以使用函數(shù)capGetDriverDescription來獲得已安裝的捕獲設備名稱及版本,將其列舉在實現(xiàn)程序過程中。再利用capDriverGetName函數(shù)來得到捕獲設備的名稱將獲得的版本發(fā)送到capDriverGetVersion。如果斷開捕獲窗口與捕獲設備的連接用capDriverDisconnect。</p><p>  捕獲窗口的狀態(tài),用capGetSt

109、atus函數(shù)來獲得當前捕獲窗口的狀態(tài),得到一個CAPSTATUS結構的拷貝。該結構的內(nèi)容包含了圖片的尺寸、卷軸的當前位置、overlay和preview是否已設置。由于其信息是動態(tài)的,每當捕獲的視頻流的尺寸發(fā)生改變,程序應該在獲取捕獲設備的視頻格式以后及時進行刷新。而捕獲窗口尺寸的改變并不影響實際的捕獲視頻流的尺寸。該尺寸由視頻捕獲設備的格式和視頻對話框決定。</p><p><b>  //捕獲窗口&

110、lt;/b></p><p>  BOOL VideoCapture::Initialize()</p><p><b>  {</b></p><p>  char devname[128]={0},devversion[128]={0};</p><p>  int index=0;</p>&l

溫馨提示

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

評論

0/150

提交評論