版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 學(xué)號:</p><p> 畢業(yè)設(shè)計(jì)</p><p> 題 目:網(wǎng)絡(luò)聊天工具的設(shè)計(jì)與實(shí)現(xiàn)</p><p> 作 者屆 別</p><p> 系 別機(jī)械與電子工程系專 業(yè)計(jì)算機(jī)科學(xué)與技術(shù)</p><p> 指導(dǎo)老師職 稱講師</p><p> 完成
2、時間2010年5月18日</p><p><b> 摘 要</b></p><p> 視頻聊天系統(tǒng)作為一種新型的通信和交流工具,突破了地域的限制,可以提供更為便捷、靈活、全面的音、視頻信息的傳遞和服務(wù),具有極其廣泛的發(fā)展前景。</p><p> 本文介紹了采用Microsoft Visual C++ 6.0編程開發(fā)視頻聊天系統(tǒng)的一套比
3、較常用的解決方案。文字聊天采用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ù)娇蛻舳撕螅鈮翰@示影像。同時,在本方案中,采用了線程
4、來實(shí)現(xiàn)語音錄制和語音回放,最終實(shí)現(xiàn)了通過服務(wù)器中轉(zhuǎn)的文字聊天、點(diǎn)對點(diǎn)的語音視頻聊天。</p><p> 關(guān)鍵詞:文字聊天;視頻捕獲;視頻傳輸;語音錄制與回放</p><p><b> Abstract</b></p><p> As a new tool about communication, video chatting system
5、 has 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 t
6、o 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 Ca
7、pture, 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
8、video capture in Windows Oper</p><p> Keywords: text chatting; Video Capture; video transmission; audio recording and playing</p><p><b> 目 錄</b></p><p><b> 摘
9、 要I</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結(jié)構(gòu)的介紹8</p><p> 2.4線程的實(shí)現(xiàn)方法9</p><p> 第三章 需求分析11</p><p>
11、3.1軟硬件環(huán)境11</p><p> 3.2需求分析11</p><p> 第四章 系統(tǒng)結(jié)構(gòu)13</p><p> 4.1硬件結(jié)構(gòu)13</p><p> 4.2軟件結(jié)構(gòu)13</p><p> 4.2.1功能需求13</p><p> 4.2.2系統(tǒng)功能模塊圖14&l
12、t;/p><p> 4.3系統(tǒng)各模塊流程圖14</p><p> 第五章 系統(tǒng)的詳細(xì)設(shè)計(jì)16</p><p> 5.1文字聊天16</p><p> 5.1.1 TCP套接字的運(yùn)用16</p><p> 5.1.2 文字聊天實(shí)現(xiàn)17</p><p> 5.2語音視頻聊天19&
13、lt;/p><p> 5.2.1 UDP套接字的運(yùn)用19</p><p> 5.2.2視頻的捕獲20</p><p> 5.2.3捕獲窗口22</p><p> 5.2.4視頻捕獲驅(qū)動24</p><p> 5.2.5語音錄制24</p><p> 5.2.6語音回放25&l
14、t;/p><p> 5.2.7視音頻的傳輸26</p><p><b> 結(jié) 論28</b></p><p><b> 參考文獻(xiàn)29</b></p><p><b> 致 謝30</b></p><p><b> 第一
15、章 引 言</b></p><p><b> 1.1課題背景</b></p><p> 隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展,互聯(lián)網(wǎng)應(yīng)用越來越豐富?;ヂ?lián)網(wǎng)以其獨(dú)特的傳播方式吸引了大量用戶,同時也給人們帶來了許多便利,譬如可以借助于網(wǎng)絡(luò)進(jìn)行相互交流、信息傳遞等。聊天工具作為互聯(lián)網(wǎng)中運(yùn)用最為廣泛的通信工具之一,它可以讓用戶之間進(jìn)行即時的交流和信息的傳遞。聊天工具的出現(xiàn)可
16、以說是基于互聯(lián)網(wǎng)通信交流方式的歷史性變革,它已經(jīng)漸漸取代了原來效率低、費(fèi)用高的如信件、電報(bào)的通信方式,以其快速、交互、簡便的方式給用戶的交流提供了簡單、易用的信息平臺,成為現(xiàn)今應(yīng)用最為廣泛的即時通信工具之一。隨著相關(guān)技術(shù)的日益發(fā)展,用戶對功能的需求不斷提高。為了更好地服務(wù)于用戶,聊天工具的功能也在不斷地完善。在未來的網(wǎng)絡(luò)時代中,聊天工具將以即時通信為其基本特點(diǎn),并與各種網(wǎng)絡(luò)應(yīng)用整合,同時隨著無線網(wǎng)絡(luò)的廣泛應(yīng)用,它將成為未來不可缺少的一種
17、通信軟件。本畢業(yè)設(shè)計(jì)的目的主要是為了滿足人們通訊交流的便捷,實(shí)現(xiàn)靈活、全面的語音、視頻信息的傳遞和服務(wù)。模擬騰訊公司的QQ聊天軟件,開發(fā)一個多功能的聊天系統(tǒng)軟件,本畢業(yè)設(shè)計(jì)主要實(shí)現(xiàn)視頻語音聊天、文字聊天功能。</p><p> 1.2國內(nèi)外研究現(xiàn)狀</p><p> 中國的大部分網(wǎng)絡(luò)用戶都擁有自己的QQ號碼。騰訊計(jì)算機(jī)系統(tǒng)有限公司成立于1998年11月。1999年2月,騰訊自主開發(fā)了基
18、于Internet的即時通信網(wǎng)絡(luò)工具——騰訊即時通信Tencent Instant Messenger,簡稱TIM或騰訊QQ。騰訊QQ經(jīng)過三年時間的發(fā)展,到2002年,其用戶群成為中國最大的互聯(lián)網(wǎng)注冊用戶群,注冊用戶達(dá)到1億6000萬,其中活躍用戶總數(shù)超過5000萬。自此騰訊QQ成為中國最大的即時通信服務(wù)提供商。騰訊公司是中國最早也是目前中國市場上最大的本土互聯(lián)網(wǎng)即時通信軟件開發(fā)商。公司成立7年多以來,一直以追求卓越的技術(shù)為導(dǎo)向,始終處
19、于穩(wěn)健、高速發(fā)展的狀態(tài)。騰訊QQ超過4.3億的注冊用戶群體現(xiàn)了網(wǎng)絡(luò)用戶對騰訊QQ這一聊天工具的廣泛應(yīng)用。在當(dāng)今市場經(jīng)濟(jì)高速發(fā)展的前提下,騰訊QQ也在不斷自我完善,漸漸地演變?yōu)橐粋€人性化、市場化的多功能的聊天工具軟件,它可以給網(wǎng)絡(luò)聊天用戶帶來越來越多的人性化服務(wù):從原來單一的文字聊天過渡到集語音、視頻、文件傳輸?shù)榷喙δ苡谝簧淼牧奶燔浖?lt;/p><p> ICQ和MSN是在國外比較盛行的即時聊天工具,騰訊QQ的開
20、發(fā)對MSN和ICQ都進(jìn)行了借鑒。ICQ是I Seek You(我找你)的縮寫,最初是一家以色列公司開發(fā)出來的免費(fèi)軟件,中文名稱目前可以稱之為“網(wǎng)絡(luò)呼叫器”,它在全球擁有超過4000萬的用戶。事實(shí)上這種軟件最主要的功能就是讓用戶知道網(wǎng)絡(luò)上的朋友現(xiàn)在有沒有上線(前提是對方也有安裝ICQ),然后可以互送Messages(消息)交談或是交換檔案等等,比電子郵件更具即時性。正如一位ICQ軟件的最初程序設(shè)計(jì)員所說:“當(dāng)你登錄因特網(wǎng)之后,你周圍都是些
21、自己熟悉的人,而且,你還可以和他們分享這種體驗(yàn),這的確是一件令人激動的事情。”</p><p> MSN是微軟推出的聊天軟件,是一套類似ICQ的網(wǎng)上即時通訊軟件,它以最簡單的方式為用戶提供強(qiáng)有力的即時消息支持,同時能使Microsoft Outlook Express(R) 和MSN Hotmail(R)變得更簡單易用。MSN Messenger Service 還可使用戶間的聯(lián)機(jī)交談變得更加輕松愉快,了解誰在
22、聯(lián)機(jī)以及查看用戶何時聯(lián)機(jī)并與其交換即時消息。用戶間可以進(jìn)行單獨(dú)的聊天,或者在同一個對話窗口中與多達(dá)四個的聯(lián)系人進(jìn)行聊天。自動的輸入指示器可讓用戶知道何時聯(lián)系人正在輸入答復(fù),還可以進(jìn)行全球電話呼叫——以非常低的費(fèi)用呼叫世界的任何地方。用戶可以選擇所要使用的電話服務(wù)提供商,從服務(wù)提供商的列表中選擇最適合的提供商。用交談取代鍵盤輸入,使用計(jì)算機(jī)上的話筒和揚(yáng)聲器就可以和位于世界各地的朋友進(jìn)行交談,甚至可以呼叫聯(lián)系人將文本消息發(fā)送到聯(lián)系人的移動電
23、話和傳呼機(jī)上(注:此特性僅適用于美國和加拿大),而進(jìn)入“聊天室”結(jié)識新朋友,或加入與名人聊天,此特性在所有地區(qū)都適用。用戶可以使用 MSN Messenger 與朋友交換照片、喜愛的音樂或任何其他文件,也可以監(jiān)視新的電子郵件并查看用戶有多少新的</p><p> 1.3本課題研究的意義</p><p> 在當(dāng)今信息時代,信息通信已成為這個世紀(jì)必不可少的組成部分,隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展,聊
24、天軟件作為即時性通信工具的主流,已被越來越多的人所喜愛。在中國,上網(wǎng)的用戶幾乎都用騰訊QQ進(jìn)行聊天。當(dāng)前騰訊QQ的注冊帳戶已經(jīng)超過4.3億,是中國用戶最多、最為流行的聊天工具。起初的QQ只支持文字聊天,隨著相關(guān)技術(shù)的發(fā)展,騰訊QQ也不斷的自我完善,增加眾多實(shí)用的、人性化的功能,得到了許多用戶的支持與喜愛?,F(xiàn)如今騰訊公司已經(jīng)初步完成了面向在線生活產(chǎn)業(yè)模式的業(yè)務(wù)布局:構(gòu)建了QQ、QQ.com、QQ游戲以及QQ移動手機(jī)門戶這四大網(wǎng)絡(luò)平臺,形成
25、了規(guī)模巨大的網(wǎng)絡(luò)社區(qū)。在滿足用戶信息傳遞與知識獲取需求方面,擁有QQ.Com門戶、QQ即時通訊工具以及年初收購的Foxmail電子郵件等;在滿足用戶群體交流和資源共享方面,騰訊推出的個人博客Q-Zone將與訪問量極大的論壇、聊天室、QQ群相互協(xié)同;在滿足用戶個性展示和娛樂服務(wù)方面,騰訊擁有非常成功的虛擬形象產(chǎn)品QQshow、QQpet(寵物)和QQGame(游戲)QQMusic/Radio/LiveTV(音樂/電臺/電視直播)等,另外對
26、手機(jī)用戶提供了彩鈴、彩信等無線增值業(yè)務(wù)</p><p> 第二章 理論知識介紹</p><p> 2.1 C++語言的介紹</p><p> C++語言是一種優(yōu)秀的面向?qū)ο蟪绦蛟O(shè)計(jì)語言,它在C語言的基礎(chǔ)上發(fā)展而來,但它比C語言更容易為人們學(xué)習(xí)和掌握。C++以其獨(dú)特的語言機(jī)制在計(jì)算機(jī)科學(xué)的各個領(lǐng)域中得到了廣泛的應(yīng)用。面向?qū)ο蟮脑O(shè)計(jì)思想是在原來結(jié)構(gòu)化程序設(shè)計(jì)方法
27、基礎(chǔ)上的一個質(zhì)的飛躍,C++完美地體現(xiàn)了面向?qū)ο蟮母鞣N特性[5]。</p><p> (1)C++支持?jǐn)?shù)據(jù)封裝 </p><p> 支持?jǐn)?shù)據(jù)封裝就是支持?jǐn)?shù)據(jù)抽象。在C++中,類是支持?jǐn)?shù)據(jù)封裝的工具,對象則是數(shù)據(jù)封裝的實(shí)現(xiàn)。面向過程的程序設(shè)計(jì)方法與面向?qū)ο蟮某绦蛟O(shè)計(jì)方法在對待數(shù)據(jù)和函數(shù)關(guān)系上是不同的,在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,將數(shù)據(jù)和對該數(shù)據(jù)進(jìn)行合法操作的函數(shù)封裝在一起作為一個類的定義,數(shù)
28、據(jù)將被隱藏在封裝體中,該封裝體通過操作接口與外界交換信息。對象被說明具有一個給定類的變量,類類似于C語言中的結(jié)構(gòu),在C語言中可以定義結(jié)構(gòu),但這種結(jié)構(gòu)中包含數(shù)據(jù),而不包含函數(shù)。C++中的類是數(shù)據(jù)和函數(shù)的封裝體。在C++中,結(jié)構(gòu)可作為一種特殊的類,它雖然可以包含函數(shù),但是它沒有私有或保護(hù)的成員。 (2)C++類中包含私有、公有和保護(hù)成員 C++類中可定義三種不同訪控制權(quán)限的成員。一種是私有(Private)成員,只有在類中
29、說明的函數(shù)才能訪問該類的私有成員,而在該類外的函數(shù)不可以訪問私有成員;另一種是公有(Public)成員,類外面也可訪問公有成員,成為該類的接口;還有一種是保護(hù)(Protected)成員,這種成員只有該類的派生類可以訪問,其余的在這個類外不能訪問。 (3)C++中通過發(fā)關(guān)消息來處理對象 </p><p> (5)C++允許函數(shù)名和運(yùn)算符重載 </p><p> C++支
30、持多態(tài)性,C++允許一個相同的標(biāo)識符或運(yùn)算符代表多個不同實(shí)現(xiàn)的函數(shù),這就稱標(biāo)識符或運(yùn)算符的重載,用戶可以根據(jù)需要定義標(biāo)識符重載或運(yùn)算符重載。 (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年推出的關(guān)于數(shù)字視頻的一個軟件包,它能使應(yīng)用程序數(shù)字化并播放從傳統(tǒng)模擬視頻源得到的視頻剪輯。VFW的一個關(guān)鍵思想是播放時不需要專用硬件,為了解決數(shù)字視頻數(shù)據(jù)量大的問題,需要對數(shù)據(jù)進(jìn)行壓
32、縮。它引進(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ū)動程序、視頻壓縮程序等[6]。</p>
33、<p> VFW主要由以下六個模塊組成:</p><p> ?。?)AVICAP.DLL:包含了執(zhí)行視頻捕獲的函數(shù),它給AVI文件、I/O和視頻音頻設(shè)備驅(qū)動程序提供一個高級接口。</p><p> ?。?)MSVIDEO.DLL:用一套特殊的DrawDib函數(shù)來處理屏幕上的視頻操作。</p><p> ?。?)MCIAVI.DRV:此驅(qū)動程序包括對VF
34、W的MCI命令的解釋器。</p><p> ?。?)AVIFILE.DLL:支持由標(biāo)準(zhǔn)多媒體I/O(mmio)函數(shù)提供的更高的命令來訪問AVI文件。</p><p> ?。?)壓縮管理器(ICM):管理用于視頻壓縮/解壓縮的編解碼器(CODEC)。</p><p> ?。?)音頻壓縮管理器ACM:提供與ICM相似的服務(wù),不同的是它適于波形音頻。</p>
35、<p> Visual C++在支持VFW方面提供有vfw32.lib、msacm32.lib、winmm.lib等庫。特別是它提供了功能強(qiáng)大、簡單易行、類似于MCIWnd的窗口類AVICap。AVICap為應(yīng)用程序提供了一個簡單的、基于消息的接口,使之能訪問視頻和波形音頻硬件,并能在將視頻流捕獲到硬盤上的過程中進(jìn)行控制。</p><p> AVICap支持實(shí)時的視頻流捕獲和單幀捕獲,并提供對視頻
36、源的控制。雖然MCI也提供數(shù)字視頻服務(wù),比如,它為顯示AVI文件的視頻提供了AVIVideo命令集,為視頻疊加提供了overlay命令集,但這些命令主要是基于文件的操作,不能滿足實(shí)時地直接從視頻緩存中獲取數(shù)據(jù)的要求。對于使用沒有視頻疊加能力的捕獲卡的PC機(jī)來說,用MCI提供的命令集是無法捕獲視頻流的。而AVICap在捕獲視頻方面具有一定的優(yōu)勢,它能直接訪問視頻緩沖區(qū),不需要生成中間文件,實(shí)時性很強(qiáng),效率很高。同時,它也可將數(shù)字視頻捕獲到
37、文件。</p><p> 在視頻捕獲之前需要創(chuàng)建一個捕獲窗,所有的捕獲操作及其設(shè)置都以它為基礎(chǔ)。用AVICap窗口類創(chuàng)建的窗口(通過capCreateCaptureWindow函數(shù)創(chuàng)建)被稱為“捕獲窗”,其窗口風(fēng)格一般為WS_CHILD和WS_VISIBLE。實(shí)際上,捕獲窗類似于標(biāo)準(zhǔn)控制(如按鈕、列表框等)。捕獲窗具有下列功能:</p><p> ?。?)將視頻流和音頻流捕獲到一個AVI
38、文件中;</p><p> ?。?)動態(tài)地同視頻和音頻輸入器件連接或斷開;</p><p> ?。?)以O(shè)verlay或Preview模式對輸入的視頻流進(jìn)行實(shí)時顯示;</p><p> (4)在捕獲時可指定所用的文件名并能將捕獲文件的內(nèi)容拷貝到另一個文件;</p><p> (5)設(shè)置捕獲速率;</p><p>
39、?。?)顯示控制視頻源、視頻格式、視頻壓縮的對話框;</p><p> ?。?)創(chuàng)建、保存或載入調(diào)色板;</p><p> ?。?)將圖像和相關(guān)的調(diào)色板拷貝到剪貼板;</p><p> ?。?)將捕獲的一個單幀圖像保存為DIB格式的文件。</p><p> AVICap在顯示視頻時提供的兩種模式:</p><p>
40、?。?)預(yù)覽(Preview)模式:該模式使用CPU資源,視頻幀先從捕獲硬件傳到系統(tǒng)內(nèi)存,接著采用GDI函數(shù)在捕獲窗中顯示。在物理上,這種模式需要通過VGA卡在監(jiān)視器上顯示。</p><p> ?。?)疊加(Overlay)模式:該模式使用硬件疊加進(jìn)行視頻顯示,疊加視頻的顯示不經(jīng)過VGA卡,疊加視頻的硬件將VGA的輸出信號與其自身的輸出信號合并,形成組合信號顯示在計(jì)算機(jī)的監(jiān)視器上。只有部分視頻捕獲卡才具有視頻疊加
41、能力。</p><p> 靈活編寫AVICap提供的回調(diào)函數(shù)還可滿足一些特殊需求。比如,將宏capCaptureSequenceNoFile同用capSetCallbackOnVideoStream登記的回調(diào)函數(shù)一起使用,可使應(yīng)用程序直接使用視頻和音頻數(shù)據(jù)。在視頻聊天的應(yīng)用程序中可利用這一點(diǎn)來獲得視頻幀,回調(diào)函數(shù)將捕獲的圖像傳到遠(yuǎn)端的計(jì)算機(jī)。應(yīng)用程序可用捕獲窗來登記回調(diào)函數(shù)(由用戶編寫,而由系統(tǒng)調(diào)用),以便在發(fā)
42、生下列情況時,它能通知應(yīng)用程序,作出相應(yīng)的反應(yīng):捕獲窗狀態(tài)改變;出錯;視頻幀和音頻緩存可以使用;在捕獲過程中,其它應(yīng)用程序處于讓步(Yield)地位。</p><p> 視頻捕獲編程也要用到涉及視頻捕獲的結(jié)構(gòu)、宏、消息和函數(shù)。令人高興的是,發(fā)送AVICap窗口消息所能完成的功能都能調(diào)用相應(yīng)的宏來完成。例如,SendMessage(hWndCap,WM_CAP_DRIVER_CONNECT,0,0L)與capDr
43、iverConnect(hWndCap,0)的作用相同,都是將創(chuàng)建的捕獲窗同視頻輸入器件連接起來。</p><p> 視頻部分主要是利用Video Capture函數(shù)庫來獲取影像的。Video Capture主要提供下列功能:連接驅(qū)動程序;獲取影像、聲音資料,并顯示在屏幕上或者是存成AVI文件;獲取單張影像顯示在屏幕上,拷貝至剪貼簿,或者是存成DIB(Device-Independent Bitmap)文件。&
44、lt;/p><p> Video Capture的主要結(jié)構(gòu):</p><p> 結(jié)構(gòu)體CAPTUREPARAMS主要包含一些獲取圖像的參數(shù):DWORD dwRequestMicroSecPerFrame代表相鄰兩個frame的獲取時間間隔;BOOL fYield值為TRUE,則表示W(wǎng)indows會以另一個thread來捕獲影像,值為FALSE,程序會在捕捉影像后顯示忙碌狀態(tài);BOOL fC
45、aptureAudio其值表示是否需要同時獲取聲音資料。</p><p> 結(jié)構(gòu)體BITMAPINFO和點(diǎn)陣圖有關(guān),主要定義了影像獲取之后顯示在屏幕上、存儲在文件中的格式,它包含兩個成員:BITMAPINFOHEADER bmiHeader描述影像性質(zhì)的結(jié)構(gòu),其成員記載了影像的大小、顏色深度和壓縮的方式,該成員在Video Capture、Video Compression Manager和DrawDib函數(shù)庫
46、中,以及有關(guān)于點(diǎn)陣圖的應(yīng)用中;RGBQUAD bmiColors指向color table第一個元素的位置。</p><p> 結(jié)構(gòu)體COMPVARS主要是記錄所有和壓縮相關(guān)的信息,重要的成員:DWORD fccHandler為compressor句柄;LPBITMAPINFO lpbiIn指向待壓縮影像BITMAPINFO的指標(biāo);LPBITMAPINFO lpbitOut:指向壓縮完影像BITMAPINFO的
47、指標(biāo);LONG lKey代表key-frame rate,而所謂key frame是指此frame在解壓縮時不需要依賴前面的frame;LONG lQ代表影像壓縮后的品質(zhì),取值為1~10000的整數(shù)。</p><p> Video Compression Functions主要記錄壓縮功能相關(guān)的信息,其包含的比較重要的成員:ICLocate輸入指向壓縮前后BITMAPINFO的指標(biāo),以及欲使用的codecs;I
48、CCompressorChoose呼叫一個系統(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);
49、ICDompressQuery詢問decompressor是否支持某種解壓縮方式;ICDompressBegin要求系統(tǒng)準(zhǔn)備相關(guān)資源以供解壓縮之用;ICDompress解壓縮某一個frame;ICDompressEnd歸還相關(guān)資源給系統(tǒng);ICDompressFree歸還COMPVARS所占用的資源[3]。 </p><p> 2.3 C/S結(jié)構(gòu)的介紹</p><p> C/S(clie
50、nt/server)結(jié)構(gòu),即被廣為熟知和使用的客戶機(jī)和服務(wù)器結(jié)構(gòu)。它是軟件系統(tǒng)體系結(jié)構(gòu),通過它可以充分利用兩端硬件環(huán)境的優(yōu)勢,將任務(wù)合理分配到client端和server端來實(shí)現(xiàn),降低了系統(tǒng)的通訊開銷。目前大多數(shù)應(yīng)用軟件系統(tǒng)都是client/server形式的兩層結(jié)構(gòu),由于現(xiàn)在的軟件應(yīng)用系統(tǒng)正在向分布式的web應(yīng)用發(fā)展,web和client/server應(yīng)用都可以進(jìn)行同樣的業(yè)務(wù)處理,應(yīng)用不同的模塊共享邏輯組件;因此,內(nèi)部用戶和外部用戶都
51、可以訪問新的和現(xiàn)有的應(yīng)用系統(tǒng),通過現(xiàn)有應(yīng)用系統(tǒng)中的邏輯可以擴(kuò)展出新的應(yīng)用系統(tǒng)。這也就是目前應(yīng)用系統(tǒng)的發(fā)展方向。傳統(tǒng)的c/s體系結(jié)構(gòu)雖然采用的是開放模式,但這只是系統(tǒng)開發(fā)一級的開放性,在特定的應(yīng)用中無論是client端還是server端都還需要特定的軟件支持。由于沒能提供用戶真正期望的開放環(huán)境,c/s結(jié)構(gòu)的軟件需要針對不同的操作系統(tǒng)開發(fā)不同版本的軟件,加之產(chǎn)品的更新?lián)Q代十分快,已經(jīng)很難適應(yīng)百臺電腦以上局域網(wǎng)用戶同時使用。而且代價高,效率低
52、。</p><p> C/S架構(gòu)軟件的優(yōu)勢與劣勢:</p><p> ?。?)應(yīng)用服務(wù)器運(yùn)行數(shù)據(jù)負(fù)荷較輕。最簡單的C/S體系結(jié)構(gòu)的數(shù)據(jù)庫應(yīng)用由兩部分組成,即客戶應(yīng)用程序和數(shù)據(jù)庫服務(wù)器程序。二者可分別稱為前臺程序與后臺程序。運(yùn)行數(shù)據(jù)庫服務(wù)器程序的機(jī)器,也稱為應(yīng)用服務(wù)器。一旦服務(wù)器程序被啟動,就隨時等待響應(yīng)客戶程序發(fā)來的請求;客戶應(yīng)用程序運(yùn)行在用戶自己的電腦上,對應(yīng)于數(shù)據(jù)庫服務(wù)器,可稱為客戶
53、電腦,當(dāng)需要對數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行任何操作時,客戶程序就自動地尋找服務(wù)器程序,并向其發(fā)出請求,服務(wù)器程序根據(jù)預(yù)定的規(guī)則作出應(yīng)答,送回結(jié)果,應(yīng)用服務(wù)器運(yùn)行數(shù)據(jù)負(fù)荷較輕。</p><p> ?。?)數(shù)據(jù)的儲存管理功能較為透明。在數(shù)據(jù)庫應(yīng)用中,數(shù)據(jù)的儲存管理功能,是由服務(wù)器程序和客戶應(yīng)用程序分別獨(dú)立進(jìn)行的,前臺應(yīng)用可以違反的規(guī)則,并且通常把那些不同的(不管是已知還是未知的)運(yùn)行數(shù)據(jù),在服務(wù)器程序中不集中實(shí)現(xiàn),例如訪問者的
54、權(quán)限,編號可以重復(fù)、必須有客戶才能建立定單這樣的規(guī)則。所有這些,對于工作在前臺程序上的最終用戶,是“透明”的,他們無須過問(通常也無法干涉)背后的過程,就可以完成自己的一切工作。在客戶服務(wù)器架構(gòu)的應(yīng)用中,前臺程序不是非常“瘦小”,麻煩的事情都交給了服務(wù)器和網(wǎng)絡(luò)。在C/S體系的下,數(shù)據(jù)庫不能真正成為公共、專業(yè)化的倉庫,它受到獨(dú)立的專門管理。</p><p> ?。?)C/S架構(gòu)的劣勢是高昂的維護(hù)成本且投資大。首先,
55、采用C/S架構(gòu),要選擇適當(dāng)?shù)臄?shù)據(jù)庫平臺來實(shí)現(xiàn)數(shù)據(jù)庫數(shù)據(jù)的真正“統(tǒng)一”,使分布于兩地的數(shù)據(jù)同步完全交由數(shù)據(jù)庫系統(tǒng)去管理,但邏輯上兩地的操作者要直接訪問同一個數(shù)據(jù)庫才能有效實(shí)現(xiàn),有這樣一些問題,如果需要建立“實(shí)時”的數(shù)據(jù)同步,就必須在兩地間建立實(shí)時的通訊連接,保持兩地的數(shù)據(jù)庫服務(wù)器在線運(yùn)行,網(wǎng)絡(luò)管理工作人員既要對服務(wù)器維護(hù)管理,又要對客戶端維護(hù)和管理,這需要高昂的投資和復(fù)雜的技術(shù)支持,維護(hù)成本很高,維護(hù)任務(wù)量大[11]。</p>
56、<p> 2.4線程的實(shí)現(xiàn)方法</p><p> 線程是一個獨(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)程中。&l
57、t;/p><p> 一個進(jìn)程中的所有線程都在該進(jìn)程的虛擬地址空間中,使用該進(jìn)程的全局變量和系統(tǒng)資源。操作系統(tǒng)給每個線程分配不同的CPU時間片,在某一個時刻,CPU只執(zhí)行一個時間片內(nèi)的線程,多個時間片中的相應(yīng)線程在CPU內(nèi)輪流執(zhí)行,由于每個時間片時間很短,所以對用戶來說,仿佛各個線程在計(jì)算機(jī)中是并行處理的。操作系統(tǒng)是根據(jù)線程的優(yōu)先級來安排CPU的時間,優(yōu)先級高的線程優(yōu)先運(yùn)行,優(yōu)先級低的線程則繼續(xù)等待。</p&g
58、t;<p> Windows提供了兩種線程:用戶界面線程和工作線程(又稱為后臺線程)。用戶界面線程通常用來處理用戶的輸入并響應(yīng)各種事件和消息,其實(shí),應(yīng)用程序的主執(zhí)行線程CWinApp對象就是一個用戶界面線程,當(dāng)應(yīng)用程序啟動時自動創(chuàng)建和啟動,同樣它的終止也意味著該程序的結(jié)束,進(jìn)程終止。工作線程用來執(zhí)行程序的后臺處理任務(wù),比如計(jì)算、調(diào)度、對串口的讀寫操作等,它和用戶界面線程的區(qū)別是它不用從CWinThread類派生來創(chuàng)建,對
59、它來說最重要的是如何實(shí)現(xiàn)工作線程任務(wù)的運(yùn)行控制函數(shù)。工作線程和用戶界面線程啟動時要調(diào)用同一個函數(shù)的不同版本;一個進(jìn)程中的所有線程共享它們父進(jìn)程的變量,但同時每個線程可以擁有自己的變量[7]。</p><p> 這里主要介紹用戶界面線程的運(yùn)用:</p><p><b> (1)線程的啟動</b></p><p> 創(chuàng)建一個用戶界面線程,首先
60、要從類CwinThread產(chǎn)生一個派生類,同時必須使DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE來聲明和實(shí)現(xiàn)這個CwinThread派生類。第二步是根據(jù)需要重載該派生類的一些成員函數(shù)如:ExitInstance()、InitInstance()、OnIdle()、PreTranslateMessage()等函數(shù)。最后調(diào)用AfxBeginThread()函數(shù)的一個版本:CWinThread* AfxBegin
61、Thread (CRuntimeClass* pThreadClass,int nPriority=THREAD_PRIORITY_NORMAL,UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL)啟動該用戶界面線程,其中第一個參數(shù)為指向定義的用戶界面線程類指針變量,第二個參數(shù)為線程的優(yōu)先級,第三個參數(shù)為線程
62、所對應(yīng)的堆棧大小,第四個參數(shù)為線程創(chuàng)建時的附加標(biāo)志,缺省為正常狀態(tài),如為CREATE_SUSP</p><p><b> ?。?)線程的優(yōu)先級</b></p><p> CwinThread類的成員函數(shù)用于線程優(yōu)先級的操作:</p><p> int GetThreadPriority();</p><p> BO
63、OL SetThradPriority()(int nPriority);</p><p> ?。?)線程的掛起和恢復(fù)</p><p> CWinThread類中包含了應(yīng)用程序掛起和恢復(fù)它所創(chuàng)建的線程的函數(shù),其中SuspendThread()用來掛起線程,暫停線程的執(zhí)行;ResumeThread()用來恢復(fù)線程的執(zhí)行。如果你對一個線程連續(xù)若干次執(zhí)行SuspendThread(),則需要連
64、續(xù)執(zhí)行相應(yīng)次的ResumeThread()來恢復(fù)線程的運(yùn)行。</p><p><b> ?。?)結(jié)束線程</b></p><p> 終止線程有三種途徑,線程可以在自身內(nèi)部調(diào)用AfxEndThread()來終止自身的運(yùn)行;可以在線程的外部調(diào)用BOOL TerminateThread(HANDLE hThread, DWORD dwExitCode)來強(qiáng)行終止一個線程的
65、運(yùn)行,然后調(diào)用CloseHandle()函數(shù)釋放線程所占用的堆棧;第三種方法是改變?nèi)肿兞?,使線程的執(zhí)行函數(shù)返回,則該線程終止。</p><p><b> 第三章 需求分析</b></p><p><b> 3.1軟硬件環(huán)境</b></p><p> 電腦兩臺以上,分別配有攝像頭、麥克風(fēng)、音箱或耳機(jī)等外部設(shè)備;Wi
66、ndows XP系統(tǒng),Microsoft Visual Studio 6.0編程開發(fā)系統(tǒng)等。</p><p><b> 3.2需求分析</b></p><p> 在同一個局域網(wǎng)中,如何根據(jù)自身業(yè)務(wù)的要求,量身定制,對視頻設(shè)備進(jìn)行合理搭配,選擇一套合理的視頻聊天室系統(tǒng)。如何來滿足局域網(wǎng)內(nèi)部用戶的通訊要求,在考慮到網(wǎng)絡(luò)帶寬的同時,提高視頻清晰度,動態(tài)畫面的流暢,語音的
67、實(shí)時傳輸?shù)?,正是現(xiàn)代社會通訊所必需的。設(shè)計(jì)本系統(tǒng)時,分析網(wǎng)絡(luò)承載、整個系統(tǒng)結(jié)構(gòu)的組建等是實(shí)現(xiàn)局域網(wǎng)文字聊天和語音視頻聊天所必需的。</p><p> 文字、語音視頻聊天作為一種廣泛的網(wǎng)絡(luò)應(yīng)用對其基礎(chǔ)的承載網(wǎng)絡(luò)環(huán)境有著較高的網(wǎng)絡(luò)要求。其中應(yīng)重點(diǎn)考慮的是網(wǎng)絡(luò)的帶寬情況、端到端的時延、時延抖動、丟包率等問題。</p><p> (1)網(wǎng)絡(luò)帶寬需求,視頻聊天對網(wǎng)絡(luò)的帶寬需求為“視頻帶寬+IP包
68、頭開銷”,計(jì)算方法為:網(wǎng)絡(luò)帶寬 = 視頻帶寬 × 1.2。</p><p> ?。?)端到端的時延,網(wǎng)絡(luò)傳輸不可避免的會發(fā)生傳輸時延,通常建議視頻聊天的通用時延小于150ms。</p><p> ?。?)時延抖動,由于音頻/視頻的傳輸為實(shí)時的交互,因此網(wǎng)絡(luò)的時延抖動更為重要,一般,視頻聊天的時延抖動控制在50ms內(nèi)。</p><p> ?。?)丟包率,網(wǎng)絡(luò)
69、數(shù)據(jù)傳輸經(jīng)常會出現(xiàn)丟包現(xiàn)象,視頻傳輸過程中數(shù)據(jù)丟包嚴(yán)重的話會影響在線視頻聊天質(zhì)量。因此,在設(shè)計(jì)上應(yīng)將網(wǎng)絡(luò)上的丟包率控制在1%以內(nèi)。</p><p> 視頻聊天對實(shí)時性要求較高的網(wǎng)絡(luò)應(yīng)用,作為其基礎(chǔ)的承載網(wǎng)絡(luò)有較高的寬帶和對網(wǎng)絡(luò)中的業(yè)務(wù)流量有較高的控制能力。而視頻聊天系統(tǒng)本身對帶寬的要求為62kbit/s~2Mbit/s,但是為了滿足流暢的視音頻效果,要求帶寬不低于384kbit/s。</p>&l
70、t;p> 文字、視頻聊天的功能和應(yīng)用效果體現(xiàn)在客戶端,而服務(wù)器端則是必不可少的,對于系統(tǒng)的需求分析在系統(tǒng)設(shè)計(jì)的過程中應(yīng)該明確、細(xì)致:</p><p> ?。?)文字聊天:首先啟動服務(wù)器端,當(dāng)用戶啟動客戶端時,用服務(wù)器保存的用戶名和密碼來驗(yàn)證客戶是否已經(jīng)登錄到服務(wù)器。只有當(dāng)有兩個以上的用戶啟動客戶端時,才可以進(jìn)行文字聊天,聊天內(nèi)容要經(jīng)過服務(wù)器中轉(zhuǎn),分別在服務(wù)器端和兩個聊天的客戶端顯示聊天。</p>
71、;<p> ?。?)語音視頻聊天:在有兩個客戶在線的情況下,才能進(jìn)行語音視頻聊天。兩個用戶要進(jìn)行語音視頻聊天時,一個用戶選中另一個用戶的用戶名,根據(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)行文字聊天。&
72、lt;/p><p><b> 第四章 系統(tǒng)結(jié)構(gòu)</b></p><p><b> 4.1硬件結(jié)構(gòu)</b></p><p> 該系統(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)行語音視頻聊天時是客戶端與客戶端
73、之間直接進(jìn)行的點(diǎn)對點(diǎn)的連接,它們之間的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)如圖1。在圖中,為了簡便,沒有畫出麥克風(fēng)、音箱或耳機(jī)等外部設(shè)備。</p><p> 圖1 網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)圖</p><p><b> 4.2軟件結(jié)構(gòu)</b></p><p><b> 4.2.1功能需求</b></p><p> 通過需求調(diào)研并
74、分析,確定系統(tǒng)具備的基本功能,包括:文字聊天、語音視頻聊天。</p><p><b> ?。?)文字聊天:</b></p><p> 文字聊天采用的是TCP模式,包括服務(wù)器端和客戶端。首先啟動服務(wù)器端,客戶端通過用戶名和密碼登錄服務(wù)器,服務(wù)器響應(yīng)客戶端登錄并提示有用戶登錄,此時兩個用戶就可以進(jìn)行文字聊天,在文字聊天時通過服務(wù)器中轉(zhuǎn),而每個用戶可以同時與多個用戶進(jìn)行文
75、字聊天。當(dāng)有用戶退出時,服務(wù)器做出響應(yīng),提示在線用戶,××用戶下線。</p><p> ?。?)語音視頻聊天:</p><p> 語音視頻聊天時采用的是UCP模式,客戶端與客戶端點(diǎn)對點(diǎn)的進(jìn)行,不需要經(jīng)過服務(wù)器端中轉(zhuǎn)。在文字聊天的基礎(chǔ)上,客戶端之間自行處理的語音視頻聊天,運(yùn)用VFW函數(shù)庫中的函數(shù)對USB口輸入的數(shù)字視頻信息進(jìn)行相關(guān)處理,比如:視頻捕獲、影像壓縮以及影像播
76、放等,同時利用線程來處理聲音部分的錄制、回放等。A客戶端向B客戶端請求語音視頻聊天是通過B客戶端的用戶名來獲得B客戶端的IP地址,并向B客戶端發(fā)送語音視頻聊天請求,當(dāng)B客戶端接受后捕獲視頻,并進(jìn)行壓縮傳輸?shù)紸客戶端解壓并進(jìn)行顯示,在B客戶端接受視頻的同時,A客戶端也捕獲視頻,壓縮傳輸?shù)紹客戶端解壓并進(jìn)行顯示。</p><p> 4.2.2系統(tǒng)功能模塊圖</p><p> 該系統(tǒng)分為服務(wù)
77、器端和客戶端,完成了文字聊天和語音視頻聊天,使用上只有文字聊天時才會通過服務(wù)器端,而對于語音視頻聊天就只需要對整個在線客戶端兩兩之間進(jìn)行點(diǎn)對點(diǎn)的視頻聊天。而在語音視頻時包括了視頻捕獲、視頻壓縮、解壓縮、語音錄制、語音回放以及視頻傳輸?shù)?。整個系統(tǒng)的功能模塊圖如圖2。</p><p> 圖2 系統(tǒng)功能模塊圖</p><p> 4.3系統(tǒng)各模塊流程圖</p><p>
78、 在整個系統(tǒng)中主要運(yùn)行兩個功能:圖3 文字聊天流程圖和圖4 語音視頻聊天流程圖。</p><p> 圖3 文字聊天流程圖</p><p> 圖4 語音視頻聊天流程圖</p><p> 第五章 系統(tǒng)的詳細(xì)設(shè)計(jì)</p><p><b> 5.1文字聊天</b></p><p> 5.1.1
79、 TCP套接字的運(yùn)用</p><p> 在文字聊天時,服務(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ā)送和接收。要使
80、用CSocket對象,首先要調(diào)用構(gòu)造函數(shù),然后調(diào)用Create函數(shù)創(chuàng)建一個Socket句柄。CSocket函數(shù)缺省是創(chuàng)建一個流Socket;如果沒有使用CArchive類,那么還可以創(chuàng)建一個數(shù)據(jù)報(bào)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ù)[2]。</p>&
81、lt;p> 圖5 TCP套接字的使用</p><p> 5.1.2 文字聊天實(shí)現(xiàn)</p><p> ChatServer服務(wù)器運(yùn)行時,利用一個CSocket對象CSocketServer啟動服務(wù)器,用函數(shù)gethostname來獲得服務(wù)器端主機(jī)名和IP,同時在服務(wù)器對話框中顯示服務(wù)器IP,并將分配的固定端口號8123顯示在對話框中。用一個list列表顯示在線用戶,隨時更新用戶登
82、錄情況,用一個edit box顯示客戶端的聊天內(nèi)容以及系統(tǒng)提示消息。每一個ChatClient客戶端啟動時,利用服務(wù)器內(nèi)定的用戶號和密碼來登錄(如圖6)。在整個系統(tǒng)中,利用鏈表來處理所有的用戶信息:當(dāng)有用戶登錄時,在鏈表尾部加入該用戶信息;當(dāng)用戶下線時,在該鏈表中刪除用戶,并提示所有用戶,該用戶下線。在對鏈表進(jìn)行操作的同時,要更新list列表中的信息。</p><p><b> 圖6 用戶登錄界面&l
83、t;/b></p><p> ChatServer服務(wù)器端響應(yīng)客戶端文字聊天時的中轉(zhuǎn)情況如圖7。</p><p> 圖7 服務(wù)器響應(yīng)文字聊天信息中轉(zhuǎn)</p><p> ChatClient客戶端兩兩間進(jìn)行文字聊天時,發(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("請連接服務(wù)器!\r\n");</p><p>
85、<b> return ;</b></p><p><b> }</b></p><p> CString str;</p><p> CString szUserName;</p><p> CMesg msg;</p><p> GetDlgItemText(
86、IDC_MESSAGE,str);</p><p> GetDlgItemText(IDC_USERNAME,szUserName);</p><p> if( str.GetLength() <= 0 )</p><p><b> {</b></p><p> SetMessageBox("請輸
87、入想要發(fā)送的信息!\r\n");</p><p><b> return ;</b></p><p><b> }</b></p><p> if ( szUserName.GetLength() <= 0)</p><p><b> {</b><
88、/p><p> SetMessageBox("請選擇說話對象!\r\n");</p><p><b> return ;</b></p><p><b> }</b></p><p><b> //消息封裝</b></p><p>
89、; msg.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ā)送文字信息</
91、b></p><p><b> 圖9 接收文字信息</b></p><p><b> 5.2語音視頻聊天</b></p><p> 5.2.1 UDP套接字的運(yùn)用</p><p> 在實(shí)現(xiàn)語音視頻聊天時,采用的是基于UDP套接字的點(diǎn)對點(diǎn)模式,而UDP面向的是無連接的數(shù)據(jù)服務(wù),其套接字的
92、使用如圖10所示。</p><p> 圖10 UDP套接字的使用</p><p> 5.2.2視頻的捕獲</p><p> 利用VFW接口,視頻捕獲可以分為以下幾個步驟:</p><p> ?。?)建立視頻采集窗口:該窗口用來接收視頻捕捉驅(qū)動程序傳來的數(shù)據(jù)和消息。</p><p> ?。?)連接視頻驅(qū)動程序:將建
93、立的視頻捕捉窗口與視頻設(shè)備驅(qū)動程序相連。</p><p> ?。?)視頻捕獲初始化。</p><p> ?。?)視頻捕捉設(shè)置:VFW下視頻捕捉參數(shù)的設(shè)置可以通過調(diào)用函數(shù)或彈出對話框的形式來實(shí)現(xiàn)。一般視頻驅(qū)動程序允許設(shè)置的參數(shù)包括視頻源選擇、視頻格式、視頻顯示格式等。</p><p> ?。?)設(shè)置回調(diào)函數(shù):通過回調(diào)函數(shù)來通知程序視頻事件的發(fā)生,比如捕捉一幀圖像成功的
94、消息,捕捉出錯的消息等。</p><p> ?。?)結(jié)束捕捉:結(jié)束捕捉是應(yīng)該有一些清除工作。如釋放分配的內(nèi)存,斷開捕捉窗口與視頻捕捉驅(qū)動程序的連接,清除視頻捕捉窗口等。</p><p> 窗口類為捕獲數(shù)字視頻流及其相關(guān)操作提供了很大的方便,靈活編寫其中的回調(diào)函數(shù)可滿足實(shí)時視頻傳輸?shù)男枰?,例如?yīng)用程序可直接從緩沖中取得數(shù)字視頻并對其進(jìn)行壓縮編碼后實(shí)時地傳到遠(yuǎn)端的客戶端。</p>
95、<p> 在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()解壓,最后用SetDIBitsToDevice()將圖像顯示出來。</
96、p><p> 基本的捕獲設(shè)置包括設(shè)置捕獲速度(每秒捕獲多少幀)、是否同時捕獲聲頻、捕獲緩沖、允許最大丟失多少幀和是否使用DOS內(nèi)存,以及使用鍵盤的哪個鍵或鼠標(biāo)的哪個鍵來終止捕獲等內(nèi)容,這些設(shè)置使用CAPTUREPARAMS結(jié)構(gòu)來描述,capCaptureGetSetup宏來得到當(dāng)前的設(shè)置,然后改變此結(jié)構(gòu)的成員變量,再使用capCaptureSetSetup宏設(shè)置新的設(shè)置。</p><p>
97、 設(shè)置捕獲速度,通過使用capCaptureGetSetup宏來得到當(dāng)前的捕捉速度,將當(dāng)前的捕捉速度保存在CAPTUREPARAMS結(jié)構(gòu)的dwRequestMicroSecPerFrame成員變量中,也可以通過設(shè)置此變量來改變當(dāng)前設(shè)置值。</p><p> 設(shè)置終止捕獲,同樣通過使用capCaptureGetSetup宏來得到當(dāng)前的設(shè)置,當(dāng)前按鍵設(shè)置保存在CAPTUREPARAMS結(jié)構(gòu)的vKeyAbort成員中
98、,鼠標(biāo)設(shè)置保存在fAbortLeftMouse和fAbortRightMouse成員中,通過修改可以設(shè)置新的熱健或者鼠標(biāo)左右鍵,修改完成后,使用capCaptureSetSetup宏來進(jìn)行更新。</p><p> 捕獲的時間限制,用CAPTUREPARAMS結(jié)構(gòu)中的fLimitEnabled表示捕獲是否有時間的限制,wTimeLimit用來設(shè)置指示捕獲最大的持續(xù)時間,其單位為秒。使用capCaptureGetS
99、etup宏來得到當(dāng)前的設(shè)置值。</p><p> 下面程序?yàn)樵O(shè)置CAPTUREPARAMS結(jié)構(gòu)的實(shí)現(xiàn)代碼:</p><p> BOOL VideoCapture::SetCapturePara()</p><p><b> {</b></p><p> CAPTUREPARMS CapParms={0};<
100、;/p><p> capCaptureGetSetup(m_capwnd,&CapParms,sizeof(CapParms));</p><p> //得到當(dāng)前的捕獲速度</p><p> CapParms.fAbortLeftMouse = FALSE;</p><p> CapParms.fAbortRightMouse =
101、 FALSE;</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>&
103、lt;p><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 param
105、eters set properly");</p><p> return ret;</p><p><b> }</b></p><p> //終止一個捕獲任務(wù)</p><p> BOOL VideoCapture::StopCapture()</p><p><b>
106、; {</b></p><p> capCaptureStop(m_capwnd);</p><p> capCaptureAbort(m_capwnd);</p><p> Sleep(500);</p><p> return TRUE;</p><p><b> }</b
107、></p><p><b> 5.2.3捕獲窗口</b></p><p> 在捕獲前必須創(chuàng)建一個捕獲窗口(Capture Widnow),下面介紹有關(guān)捕獲窗口的情況:創(chuàng)建一個AVICap捕獲窗口,用capCreateCaptureWindow函數(shù)并返回一個句柄。將捕獲窗口連接至捕獲設(shè)備,用capDriverConnect函數(shù)來使一個捕獲窗口與一個捕獲設(shè)備連接
108、或關(guān)聯(lián)連接上后,就可以通過捕獲窗口向捕獲設(shè)備發(fā)送各種消息,可以使用函數(shù)capGetDriverDescription來獲得已安裝的捕獲設(shè)備名稱及版本,將其列舉在實(shí)現(xiàn)程序過程中。再利用capDriverGetName函數(shù)來得到捕獲設(shè)備的名稱將獲得的版本發(fā)送到capDriverGetVersion。如果斷開捕獲窗口與捕獲設(shè)備的連接用capDriverDisconnect。</p><p> 捕獲窗口的狀態(tài),用cap
109、GetStatus函數(shù)來獲得當(dāng)前捕獲窗口的狀態(tài),得到一個CAPSTATUS結(jié)構(gòu)的拷貝。該結(jié)構(gòu)的內(nèi)容包含了圖片的尺寸、卷軸的當(dāng)前位置、overlay和preview是否已設(shè)置。由于其信息是動態(tài)的,每當(dāng)捕獲的視頻流的尺寸發(fā)生改變,程序應(yīng)該在獲取捕獲設(shè)備的視頻格式以后及時進(jìn)行刷新。而捕獲窗口尺寸的改變并不影響實(shí)際的捕獲視頻流的尺寸。該尺寸由視頻捕獲設(shè)備的格式和視頻對話框決定。</p><p><b> //
110、捕獲窗口</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>
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 網(wǎng)絡(luò)視頻聊天工具的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文
- 網(wǎng)絡(luò)聊天工具的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)設(shè)計(jì)
- 畢業(yè)論文---局域網(wǎng)聊天工具的設(shè)計(jì)與實(shí)現(xiàn)
- 局域網(wǎng)聊天工具設(shè)計(jì)畢業(yè)論文
- 畢業(yè)設(shè)計(jì)--網(wǎng)絡(luò)聊天工具的設(shè)計(jì)與實(shí)現(xiàn)(含外文翻譯)
- 基于netbios的聊天工具
- 基于java的網(wǎng)絡(luò)安全聊天工具畢業(yè)設(shè)計(jì)
- 聊天工具仿真表情插件的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于OpenSSL開發(fā)的聊天工具的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于android的即時聊天工具
- 基于linux的socket網(wǎng)絡(luò)編程聊天工具課程設(shè)計(jì)
- 基于.net的局域網(wǎng)聊天工具論文
- 基于qt4的視頻聊天工具的設(shè)計(jì)與實(shí)現(xiàn)
- 基于arm9-linux系統(tǒng)下的聊天工具軟件設(shè)計(jì)【畢業(yè)論文】
- 網(wǎng)絡(luò)聊天工具與傳統(tǒng)紙媒跨媒體整合初探.pdf
- java網(wǎng)頁版即時聊天工具開題報(bào)告
- 基于QT4的視頻聊天工具的設(shè)計(jì)與實(shí)現(xiàn).doc
- 開題報(bào)告-基于android的即時聊天工具
- 基于.net的局域網(wǎng)聊天工具
- java基于tcp_ip協(xié)議的聊天工具的設(shè)計(jì)與開發(fā)畢業(yè)設(shè)計(jì)
評論
0/150
提交評論