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