版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
多媒體網(wǎng)絡(luò)通信技術(shù)大作業(yè)1、題目:基于局域網(wǎng)的可視對講系統(tǒng)設(shè)計(jì)2、系統(tǒng)開發(fā)環(huán)境與工具:(1)、硬件環(huán)境:實(shí)驗(yàn)室局域網(wǎng)(2)、軟件環(huán)境:WindowsXP操作系統(tǒng)(3)、開發(fā)工具:自己熟悉的面向?qū)ο蟮木W(wǎng)絡(luò)通信編程工具與平臺,相關(guān)音頻、視頻編碼與傳輸協(xié)議類庫3、要求與評分標(biāo)準(zhǔn):(1)要求:在以上硬軟件環(huán)境下,利用合適的開發(fā)工具,設(shè)計(jì)一套可視對講軟件,實(shí)現(xiàn)局域網(wǎng)內(nèi)兩臺計(jì)算機(jī)之間的可視對講功能,要求音視頻信號連續(xù)性、實(shí)時(shí)性較好,滿足正常交流需要。(2)評分標(biāo)準(zhǔn)系統(tǒng)原理分析(201.系統(tǒng)原理概述(10分)分)2.關(guān)鍵技術(shù)分析(10分)系統(tǒng)總體方案設(shè)計(jì)1.按模塊化設(shè)計(jì)要求畫系統(tǒng)結(jié)構(gòu)圖(15分)(30分)2數(shù)據(jù)流分析(15分)系統(tǒng)具體設(shè)計(jì)(30呼叫處理模塊流程圖與關(guān)鍵代碼(6分)分)音視頻采集與播放模塊流程圖與關(guān)鍵代碼(6分)音視頻處理(編解碼)模塊流程圖與關(guān)鍵代
碼(6分)音視頻封包與解析模塊流程圖與關(guān)鍵代碼(6分)音視頻發(fā)送與接收模塊流程圖與關(guān)鍵代碼(6分)系統(tǒng)測試與評價(jià)(20)實(shí)現(xiàn)語音通信(6分)實(shí)現(xiàn)視頻通信(6分)實(shí)現(xiàn)音視頻同步(8分)TOC\o"1-5"\h\z\o"CurrentDocument"摘要 1\o"CurrentDocument".軟件開發(fā)工具 2\o"CurrentDocument"WIN32 SDK編程 2\o"CurrentDocument"TCP/IP協(xié)議及WINDOWSSOCKETS 網(wǎng)絡(luò)編程接口 3\o"CurrentDocument"TCP/IP協(xié)議簡介 3\o"CurrentDocument"WindowsSocket網(wǎng)絡(luò)編程簡介 4\o"CurrentDocument"VC++6.0簡介 4\o"CurrentDocument"VideoforWindows 簡介 5\o"CurrentDocument"G729.dll的簡介 5\o"CurrentDocument"LanMsgLibrary.dll 的簡介 6\o"CurrentDocument".系統(tǒng)原理分析 7\o"CurrentDocument"系統(tǒng)原理概述 7\o"CurrentDocument"關(guān)鍵技術(shù)分析 7\o"CurrentDocument".系統(tǒng)總體方案設(shè)計(jì) 8\o"CurrentDocument"系統(tǒng)功能模塊圖 8\o"CurrentDocument"語音聊天過程分析 9\o"CurrentDocument"視頻聊天過程分析 10\o"CurrentDocument".系統(tǒng)具體設(shè)計(jì) 11\o"CurrentDocument"語音視頻聊天的實(shí)現(xiàn) 11\o"CurrentDocument"視頻的捕捉 11\o"CurrentDocument"窗口的捕捉 14\o"CurrentDocument"視頻捕獲驅(qū)動 16\o"CurrentDocument"語音錄制 16\o"CurrentDocument"語音播放 17\o"CurrentDocument"視音頻的傳輸 19\o"CurrentDocument".系統(tǒng)測試與評價(jià) 20\o"CurrentDocument"測試 20\o"CurrentDocument"測試結(jié)果分析 21\o"CurrentDocument".心得體會 22\o"CurrentDocument".參考文獻(xiàn) 23武漢理工大學(xué)《多媒體網(wǎng)絡(luò)通信技術(shù)》大作業(yè)摘要隨著互聯(lián)網(wǎng)技術(shù)的飛速發(fā)展,基于網(wǎng)絡(luò)的即時(shí)通信給人們帶來諸多便利,也成為當(dāng)今網(wǎng)絡(luò)應(yīng)用的主流。聊天工具作為當(dāng)今使用最為廣泛的即時(shí)通信工具之一,可以方便人們隨時(shí)隨地進(jìn)行在線交流,比如騰訊公司的QQ聊天軟件。本次設(shè)計(jì)就是開發(fā)一個(gè)包括語音及視頻交流等功能的聊天軟件。本設(shè)計(jì)的開發(fā)采用VC++編程語言進(jìn)行本軟件的開發(fā)。本文對開發(fā)環(huán)境和開發(fā)語言進(jìn)行了簡單介紹;對本設(shè)計(jì)所要開發(fā)的多功能聊天軟件作了較為詳細(xì)的需求分析,并給出了多功能聊天軟件的設(shè)計(jì)方案,主要功能包括文字聊天、語音聊天及視頻聊天等;本次設(shè)計(jì)主要實(shí)現(xiàn)的是多功能聊天軟件的部分功能,即語音聊天、視頻聊天等功能,主要實(shí)現(xiàn)用戶注冊、用戶登錄、用戶之間語音、視頻聊天功能;與另一位同學(xué)開發(fā)實(shí)現(xiàn)的文字聊天與文件傳輸模塊集成在一起,構(gòu)成一個(gè)實(shí)用的、功能完善的聊天軟件,達(dá)到預(yù)期目標(biāo);通過運(yùn)行、測試與分析說明,該多功能聊天軟件運(yùn)行穩(wěn)定、可靠,具有一定的實(shí)用價(jià)值。關(guān)鍵詞:聊天軟件;視頻聊天;語音聊天;VC++武漢理工大學(xué)《多媒體網(wǎng)絡(luò)通信技術(shù)》大作業(yè).軟件開發(fā)工具WIN32SDK編程所謂的Win32開發(fā),就是在C++語言的層面上,直接使用Win32API(ApplicationProgrammingInterface:系統(tǒng)開放出來,給程序員使用的接口。)開發(fā)Windows應(yīng)用程序或者系統(tǒng)程序。所謂的Win32,其實(shí)是一個(gè)API規(guī)范,與UNIX系統(tǒng)編程接口標(biāo)準(zhǔn)POSIX是相對應(yīng)的。下面是進(jìn)行直接的Win32SDK方式編程的基本思路或者說是一個(gè)框架。一個(gè)Windows程序分為程序代碼和UI(UserInterface用戶界面)資源兩大部分,兩部分最后以RC編譯程序編譯為一個(gè)完整的EXE文件。所謂UI資源是指功能菜單、對話框外貌、程序圖標(biāo)、光標(biāo)形狀等等。這些UI資源的實(shí)際內(nèi)容借助各種工具產(chǎn)生,并以各種擴(kuò)展名存在,如.ico.bmp.cur等等。程序員必須在一個(gè)所謂的資源描述檔(.rc)中描述它們。RC編譯器(RC.EXE)讀取RC文件的描述后將所有UI資源文件集中制作出一個(gè).Res資源文件,再與程序代碼結(jié)合在一起,這才是一個(gè)完整的Windows可執(zhí)行文件。.WinMain函數(shù)main()函數(shù)是C++程序的進(jìn)入點(diǎn),而WinMain函數(shù)則是Windows程序的進(jìn)入點(diǎn)。.Msg結(jié)構(gòu)體定義了一個(gè)Msg結(jié)構(gòu)體,是Windows內(nèi)設(shè)的一種數(shù)據(jù)格式,在Windows程序中,消息是由MSG結(jié)構(gòu)體來表示的。.注冊窗口RegisterClass()完成注冊窗口類的功能,設(shè)定窗口的屬性:邊框、顏色、標(biāo)題、位置等等。.創(chuàng)建窗口CreateWindow函數(shù)可以用于創(chuàng)建父窗口、彈出窗口以及子窗口,在創(chuàng)建窗口時(shí)它可以確定窗口類、窗口標(biāo)題、窗口風(fēng)格、大小以及初始化位置。.顯示窗口創(chuàng)建窗口后需要使用ShowWindow函數(shù)用于顯示窗口。武漢理工大學(xué)《多媒體網(wǎng)絡(luò)通信技術(shù)》大作業(yè)6、刷新窗口調(diào)用UpdateWindow函數(shù)來刷新窗口。.消息循環(huán)初始化工作完成后,WinMain進(jìn)入所謂的消息循環(huán),使用while循環(huán),不斷的GetMessage,再使用TranslateMessage將消息轉(zhuǎn)化,用DispatchMessage將消息傳遞給窗口函數(shù)去處理。.獲取消息GetMessage功能函數(shù)從消息隊(duì)列中獲取消息,如果消息隊(duì)列中沒有消息,此功能函數(shù)則會一直等得消息。.轉(zhuǎn)換消息將特定的消息轉(zhuǎn)換為不同的消息,例如消息隊(duì)列中同時(shí)有WM_KEYDOWN和WM_KEYUP消息時(shí),意味著用戶同時(shí)按下了鍵盤上的某幾個(gè)鍵,此時(shí)TranslateMessage將其轉(zhuǎn)換為一個(gè)WM_CHAR消息。.將消息發(fā)送到回調(diào)函數(shù)DispatchMessage通過USER模塊的協(xié)助將消息送到該窗口的窗口函數(shù)去了,但是DispatchMessage并沒有指定函數(shù)名,卻可以將消息傳送過去,這是因?yàn)橄l(fā)生的時(shí)候,OS已經(jīng)根據(jù)當(dāng)時(shí)狀態(tài),為它標(biāo)明了所屬窗口,而窗口所屬的窗口類亦是明確的。.WinMain函數(shù)返回值returnmsg.wParam; 〃返回結(jié)構(gòu)體變量msg中的wParam的值。.WindowProc窗口函數(shù)窗口中的生命樞紐:窗口函數(shù)WindowProc。WindowProc是一個(gè)callback函數(shù),常利用switch/case方式判斷消息的種類,以決定處理方式。TCP/IP協(xié)議及WINDOWSSOCKETS網(wǎng)絡(luò)編程接口TCP/IP協(xié)議簡介TCP/IP已成為當(dāng)今計(jì)算機(jī)網(wǎng)絡(luò)最成熟、應(yīng)用最廣的互聯(lián)協(xié)議。Internet武漢理工大學(xué)《多媒體網(wǎng)絡(luò)通信技術(shù)》大作業(yè)采用的就是TCP/IP協(xié)議,網(wǎng)絡(luò)上各種各樣的計(jì)算機(jī)上只要安裝了 TCP/IP協(xié)議,它們之間就能相互通信。運(yùn)行TCP/IP協(xié)議的網(wǎng)絡(luò)是一種采用包(分組)交換網(wǎng)絡(luò)。TCP/IP協(xié)議是由100多個(gè)協(xié)議組成的協(xié)議集,TCP和IP是其中兩個(gè)最重要的協(xié)議。通常包含了一系列與“TCP(傳輸控制協(xié)議)”和“IP(網(wǎng)際協(xié)議)”有聯(lián)系的網(wǎng)絡(luò)協(xié)議,它包括其它的協(xié)議,應(yīng)用軟件,甚至網(wǎng)絡(luò)媒介。這些協(xié)議的示例是:UDP(UserDatagramProtocol)協(xié)議、ICMP(InternetControlMessageProtocol)協(xié)議、ARP(地址解析協(xié)議)和其他一些協(xié)議的協(xié)議組。TCP和IP兩個(gè)協(xié)議分別屬于傳輸層和網(wǎng)絡(luò)層,在 Internet中起著不同的作用。WindowsSocket網(wǎng)絡(luò)編程簡介Socket實(shí)際在計(jì)算機(jī)中提供了一個(gè)通信端口,可以通過這個(gè)端口與任何一個(gè)具有Socket接口的計(jì)算機(jī)通信。應(yīng)用程序在網(wǎng)絡(luò)上傳輸,接收的信息都通過這個(gè)Socket接口來實(shí)現(xiàn)。WindowsSockets規(guī)范定義了一套開放的、支持多種協(xié)議的、Windows下的網(wǎng)絡(luò)編程接口。它不僅包含了人們所熟悉的BerkeleySocket風(fēng)格的庫函數(shù),也包含了一組針對Windows的擴(kuò)展庫函數(shù),使得程序員能充分地利用Windows消息驅(qū)動機(jī)制進(jìn)行編程。現(xiàn)在的WindowsSockets已經(jīng)基本上實(shí)現(xiàn)了與協(xié)議無關(guān),你可以使用WindowsSockets來調(diào)用多種協(xié)議的功能,但較常使用的是TCP/IP協(xié)議。VC++6.0簡介我們通常所說的VisualC++實(shí)際上是一個(gè)完善的、非常強(qiáng)大的C++程序開發(fā)環(huán)境,它的名字是MicrosoftDeveloperStudio。二者之間的細(xì)小差別并不重要,通常這兩個(gè)術(shù)語可以互換。但如果你不圍繞DeveloperStudio來進(jìn)行學(xué)習(xí),就不能有效地使用VisualC++(DeveloperStudio聽起來很像VisualStudio,但它們之間沒有關(guān)系)。它包含:C++編譯器、調(diào)試器、應(yīng)用程序框架生成器、項(xiàng)目管理器、設(shè)計(jì)和實(shí)現(xiàn)菜單等資源的編輯器等等。武漢理工大學(xué)《多媒體網(wǎng)絡(luò)通信技術(shù)》大作業(yè)VideoforWindows簡介VFW是Microsoft1992年推出的關(guān)于數(shù)字視頻的一個(gè)軟件包,它能使應(yīng)用程序數(shù)字化并播放從傳統(tǒng)模擬視頻源得到的視頻剪輯。VFW的一個(gè)關(guān)鍵思想是播放時(shí)不需要專用硬件,為了解決數(shù)字視頻數(shù)據(jù)量大的問題,需要對數(shù)據(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è)置屬性來捕獲、播放和編輯視頻剪輯?,F(xiàn)在用戶不必專門安裝VFW了,Windows95本身包括了VideoforWindows1.1,當(dāng)用戶在安裝Windows時(shí),安裝程序會自動地安裝配置視頻所需的組件,如設(shè)備驅(qū)動程序、視頻壓縮程序等。VFW主要由以下六個(gè)模塊組成:(1)AVICAP.DLL:包含了執(zhí)行視頻捕獲的函數(shù),它給AVI文件I/O和視頻、音頻設(shè)備驅(qū)動程序提供一個(gè)高級接口。(2)MSVIDEO.DLL:用一套特殊的DrawDib函數(shù)來處理屏幕上的視頻操作。(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ù),不同的是它適于波形音頻。G729.dll的簡介G.729算法是ITU-T制定的編碼速率為8kb/s的共軛結(jié)構(gòu)碼激勵(lì)線性預(yù)測聲碼器語音編碼算法標(biāo)準(zhǔn),作為低速率的語音編碼器,在傳輸?shù)膸捰邢薜那闆r下運(yùn)用越來越受到廣泛的重視。G.729系列算法聲碼器的原理都是相通的,各種算法不同之處在于算法的簡化和編碼比特的多少。G.729編碼器是基于碼激勵(lì)線性武漢理工大學(xué)《多媒體網(wǎng)絡(luò)通信技術(shù)》大作業(yè)預(yù)測(CELP)聲碼器模型的。這個(gè)編碼器運(yùn)算的幀長為10ms,相應(yīng)于抽樣率為8000kHz的語音數(shù)據(jù)流的80個(gè)樣值,具有8kbit/s的編碼速率,較低的延遲和高編碼語音質(zhì)量等優(yōu)點(diǎn)。本程序在語音聊天模塊中,調(diào)用了G729.dll動態(tài)鏈接庫文件,它包括G.729的函數(shù)和資源,是一種可執(zhí)行文件,它允許程序共享執(zhí)行特殊任務(wù)所必需的代碼和其他資源。LanMsgLibrary.dll的簡介該聊天軟件系統(tǒng)的語音聊天、視頻聊天功能的實(shí)現(xiàn)主要是引用了LanMsgLibrary.dll這個(gè)動態(tài)鏈接庫文件,它包括VFW以及其他相關(guān)的函數(shù)與資源。在音頻與視頻聊天實(shí)現(xiàn)的過程中,程序就引用了LanMsgLibrary.dll中的VFW以及相關(guān)的函數(shù)和資源。在視頻聊天過程中,主要實(shí)現(xiàn)了視頻的捕獲與播放,視頻流的壓縮與解壓。在語音聊天過程中,主要實(shí)現(xiàn)了聲音的采集與播放,通過調(diào)用了G729.dll動態(tài)鏈接庫文件,對音頻進(jìn)行了壓縮與解壓。在整個(gè)語音聊天與視頻聊天實(shí)現(xiàn)的過程中,程序主要對LanMsgLibrary.dll的引用來實(shí)現(xiàn)其功能。武漢理工大學(xué)《多媒體網(wǎng)絡(luò)通信技術(shù)》大作業(yè)2.系統(tǒng)原理分析系統(tǒng)原理概述從技術(shù)上而言,音視頻通信技術(shù),涉及音視頻設(shè)備操作、音視頻流編解碼、媒體流網(wǎng)絡(luò)傳輸、流媒體接受處理等相關(guān)技術(shù)。另外,由于媒體流信息量大,及時(shí)要求度高,還要保障媒體幀的流暢性,這就對依賴于高速網(wǎng)絡(luò)、高性能的硬件設(shè)備以及相關(guān)媒體流網(wǎng)絡(luò)包的建包和解包算法。關(guān)鍵技術(shù)分析對于一個(gè)端對端的語音聊天系統(tǒng)來說,主要涉及兩個(gè)方面的動作,即語音的采集和播放、語音數(shù)據(jù)的發(fā)送和接收。系統(tǒng)采用多線程的設(shè)計(jì)思想來完成并協(xié)調(diào)各個(gè)過程。語音的采集實(shí)際上就是一個(gè)音頻壓縮的過程。語音的播放是聲音數(shù)據(jù)流的還原過程,通過一個(gè)父線程讀取接收線程接收到的數(shù)據(jù),并通過管道讓其子線程播放解壓后的聲音數(shù)據(jù)。語音數(shù)據(jù)的發(fā)送和接收主要用Socket編程來實(shí)現(xiàn),socket是網(wǎng)絡(luò)通訊過程中端點(diǎn)的抽象表示。為了通過socket接口進(jìn)行網(wǎng)絡(luò)通訊,程序在對話的每一端都需要一個(gè)socket,兩個(gè)socket采用無連接的UDP協(xié)議。視頻模塊的設(shè)計(jì)思想與語音模塊一致,也涉及到兩個(gè)方面的動作,視頻的采集和播放,視頻數(shù)據(jù)的發(fā)送和接收。視頻的采集與播放是基于VFW來實(shí)現(xiàn)的,利用VFW的關(guān)于數(shù)字視頻的軟件包實(shí)現(xiàn)對視頻的采集與播放。視頻數(shù)據(jù)的發(fā)送與接收同樣采用了Socket編程,在發(fā)送視頻時(shí),通過Socket端口進(jìn)行監(jiān)聽。當(dāng)收到對方發(fā)送的包含視頻請求信息和對方IP地址、端口號等信息后,如果同意請求,則向請求方發(fā)送包含了本地IP、端口號的接受視頻信息,這樣就建立了連接,開始視頻聊天。TCP/IP是一組用于實(shí)現(xiàn)網(wǎng)絡(luò)互連的通信協(xié)議。Internet網(wǎng)絡(luò)體系結(jié)構(gòu)以TCP/IP為核心。基于TCP/IP的參考模型將協(xié)議分成四個(gè)層次,它們分別是:網(wǎng)絡(luò)訪問層、網(wǎng)際互連層、傳輸層(主機(jī)到主機(jī))、和應(yīng)用層。UDP協(xié)議的全稱是用戶數(shù)據(jù)包協(xié)議,在網(wǎng)絡(luò)中它與TCP協(xié)議一樣用于處理數(shù)據(jù)包,是一種無連接的協(xié)議。武漢理工大學(xué)《多媒體網(wǎng)絡(luò)通信技術(shù)》大作業(yè)3.系統(tǒng)總體方案設(shè)計(jì)3.1系統(tǒng)功能模塊圖圖3.1.2語音視頻聊天流程圖武漢理工大學(xué)《多媒體網(wǎng)絡(luò)通信技術(shù)》大作業(yè)語音聊天過程分析用戶1通過麥克對自己的聲音進(jìn)行采集,在通過壓縮,使其在網(wǎng)絡(luò)上傳輸?shù)男矢?,然后再進(jìn)行傳輸,當(dāng)用戶2接收到用戶1的聲音數(shù)據(jù)后將其解壓,然后進(jìn)行播放。圖3.2.1語音模塊數(shù)據(jù)流程圖在進(jìn)行語音聊天時(shí),兩臺計(jì)算機(jī)必須先要建立連接,如圖5所示,用戶1向用戶2發(fā)送“發(fā)送語音請求”信息,用戶2收到用戶1請求信息后,發(fā)送回應(yīng)信息給用戶1,如果用戶2同意,開始語音聊天;不同意,停止語音聊天。武漢理工大學(xué)《多媒體網(wǎng)絡(luò)通信技術(shù)》大作業(yè)視頻聊天過程分析用戶1通過攝像頭進(jìn)行視頻采集,經(jīng)過壓縮后,向用戶2發(fā)送采集后的視頻數(shù)據(jù)。用戶2接收到用戶1發(fā)送的視頻數(shù)據(jù)并將其進(jìn)行解壓,然后在用戶2的采集窗口上播放,這樣視頻的傳輸就完成了。視頻模塊數(shù)據(jù)傳輸流程如圖3所示。圖3.3.1視頻模塊數(shù)據(jù)傳輸流程圖在進(jìn)行視頻數(shù)據(jù)傳輸前,兩臺計(jì)算機(jī)必須先要建立連接,其原理和語音聊天建立連接的原理一致。用戶1向用戶2發(fā)送視頻請求,用戶2在接收到用戶1的請求后,給用戶1發(fā)送收到請求后的回應(yīng)信息,如果同意用戶1的請求則用戶1與用戶2開始視頻聊天,如果不同意就終止視頻聊天。視頻聊天建立連接如圖7所示。圖2.3.2視頻聊天建立連接圖10武漢理工大學(xué)《多媒體網(wǎng)絡(luò)通信技術(shù)》大作業(yè).系統(tǒng)具體設(shè)計(jì)語音視頻聊天的實(shí)現(xiàn)在實(shí)現(xiàn)語音視頻聊天時(shí),采用的是基于UDP套接字的點(diǎn)對點(diǎn)模式,即用戶與用戶之間的數(shù)據(jù)傳輸。其套接字的使用如下圖。圖4.1語音視頻聊天套接字圖視頻的捕捉利用VFW接口,視頻捕獲可以分為以下幾個(gè)步驟:.建立視頻采集窗口:該窗口用來接收視頻捕捉驅(qū)動程序傳來的數(shù)據(jù)和消息。11武漢理工大學(xué)《多媒體網(wǎng)絡(luò)通信技術(shù)》大作業(yè).連接視頻驅(qū)動程序:將建立的視頻捕捉窗口與視頻設(shè)備驅(qū)動程序相連。.視頻捕獲初始化。.視頻捕捉設(shè)置:VFW下視頻捕捉參數(shù)的設(shè)置可以通過調(diào)用函數(shù)或彈出對話框的形式來實(shí)現(xiàn)。一般視頻驅(qū)動程序允許設(shè)置的參數(shù)包括視頻源選擇、視頻格式、視頻顯示格式等。.設(shè)置回調(diào)函數(shù):通過回調(diào)函數(shù)來通知程序視頻事件的發(fā)生,比如捕捉一幀圖像成功的消息,捕捉出錯(cuò)的消息等。.結(jié)束捕捉:結(jié)束捕捉是應(yīng)該有一些清除工作。如釋放分配的內(nèi)存,斷開捕捉窗口與視頻捕捉驅(qū)動程序的連接,清除視頻捕捉窗口等。窗口類為捕獲數(shù)字視頻流及其相關(guān)操作提供了很大的方便,靈活編寫其中的回調(diào)函數(shù)可滿足實(shí)時(shí)視頻傳輸?shù)男枰鐟?yīng)用程序可直接從緩沖中取得數(shù)字視頻并對其進(jìn)行壓縮編碼后實(shí)時(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()解壓,最后用SetDIBitsToDevice()將圖像顯示出來?;镜牟东@設(shè)置包括設(shè)置捕獲速度(每秒捕獲多少幀)、是否同時(shí)捕獲聲頻、捕獲緩沖、允許最大丟失多少幀和是否使用DOS內(nèi)存,以及使用鍵盤的哪個(gè)鍵或鼠標(biāo)的哪個(gè)鍵來終止捕獲等內(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)的dwRequestMicroSecPerFrame成員變量中,也可以通過設(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)行更新。12武漢理工大學(xué)《多媒體網(wǎng)絡(luò)通信技術(shù)》大作業(yè)捕獲的時(shí)間限制,用CAPTUREPARAMS結(jié)構(gòu)中的fLimitEnabled表示捕獲是否有時(shí)間的限制,wTimeLimit用來設(shè)置指示捕獲最大的持續(xù)時(shí)間,其單位為秒。使用capCaptureGetSetup宏來得到當(dāng)前的設(shè)置值。下面程序?yàn)樵O(shè)置CAPTUREPARAMS結(jié)構(gòu)的實(shí)現(xiàn)代碼:BOOLVideoCapture::SetCapturePara()(CAPTUREPARMSCapParms={0};capCaptureGetSetup(m_capwnd,&CapParms,sizeof(CapParms));〃得到當(dāng)前的捕獲速度CapParms.fAbortLeftMouse=FALSE;CapParms.fAbortRightMouse=FALSE;CapParms.fYield=TRUE;CapParms.fCaptureAudio=FALSE;CapParms.wPercentDropForError=80;if(!capCaptureSetSetup(m_capwnd,&CapParms,sizeof(CapParms))){//log.WriteString("\nFailedtosetthecaptureparameters");returnFALSE;}//SetVideoFormatcapGetVideoFormat(m_capwnd,&m_bmpinfo,sizeof(m_bmpinfo));m_bmpinfo.bmiHeader.biWidth=IMAGE_WIDTH;m_bmpinfo.bmiHeader.biHeight=IMAGE_HEIGHT;BOOLret=capSetVideoFormat(m_capwnd,&m_bmpinfo,sizeof(m_bmpinfo));//log.WriteString("\nVideoparameterssetproperly");returnret;}〃終止一個(gè)捕獲任務(wù)13武漢理工大學(xué)《多媒體網(wǎng)絡(luò)通信技術(shù)》大作業(yè)BOOLVideoCapture::StopCapture()(capCaptureStop(m_capwnd);capCaptureAbort(m_capwnd);Sleep(500);returnTRUE;)窗口的捕捉在捕獲前必須創(chuàng)建一個(gè)捕獲窗口(CaptureWidnow),下面介紹有關(guān)捕獲窗口的情況:創(chuàng)建一個(gè)AVICap捕獲窗口,用capCreateCaptureWindow函數(shù)并返回一個(gè)句柄。將捕獲窗口連接至捕獲設(shè)備,用capDriverConnect函數(shù)來使一個(gè)捕獲窗口與一個(gè)捕獲設(shè)備連接或關(guān)聯(lián)連接上后,就可以通過捕獲窗口向捕獲設(shè)備發(fā)送各種消息,可以使用函數(shù)capGetDriverDescription來獲得已安裝的捕獲設(shè)備名稱及版本,將其列舉在實(shí)現(xiàn)程序過程中。再利用capDriverGetName函數(shù)來得到捕獲設(shè)備的名稱將獲得的版本發(fā)送到capDriverGetVersion。如果斷開捕獲窗口與捕獲設(shè)備的連接用capDriverDisconnect。捕獲窗口的狀態(tài),用capGetStatus函數(shù)來獲得當(dāng)前捕獲窗口的狀態(tài),得到一個(gè)CAPSTATUS結(jié)構(gòu)的拷貝。該結(jié)構(gòu)的內(nèi)容包含了圖片的尺寸、卷軸的當(dāng)前位置、overlay和preview是否已設(shè)置。由于其信息是動態(tài)的,每當(dāng)捕獲的視頻流的尺寸發(fā)生改變,程序應(yīng)該在獲取捕獲設(shè)備的視頻格式以后及時(shí)進(jìn)行刷新。而捕獲窗口尺寸的改變并不影響實(shí)際的捕獲視頻流的尺寸。該尺寸由視頻捕獲設(shè)備的格式和視頻對話框決定?!ú东@窗口BOOLVideoCapture::Initialize()(chardevname[128]={0},devversion[128]={0};intindex=0;14武漢理工大學(xué)《多媒體網(wǎng)絡(luò)通信技術(shù)》大作業(yè)BOOLret=TRUE,retl=TRUE,ret2=TRUE,ret3=TRUE;TRACE("VideoCapture::Initialize\n");〃創(chuàng)建一個(gè)AVICap捕獲窗口m_capwnd =capCreateCaptureWindow("Capture”,WS_POPUP,0,0,1,1,0,0);if(!m_capwnd)(returnFALSE;)//connectcallbackfunctionsret=capSetUserData(m_capwnd,this);//Changedestroyfunctionsalso ret1=capSetCallbackOnVideoStream(m_capwnd,OnCaptureVideo);〃得到已安裝的捕獲設(shè)備的名稱及版本ret2=capGetDriverDescription(index,devname,100,devversion,100);//Connecttowebcamdriver〃使一個(gè)捕獲窗口與一個(gè)捕獲設(shè)備連接或關(guān)聯(lián)ret3=capDriverConnect(m_capwnd,index);if(!(ret&&ret1&&ret2&&ret3))(//Devicemaybeopenalreadyoritmaynothavebeen//closedproperlylasttime.AfxMessageBox("UnabletoopenVideoCaptureDevice");//log.WriteString("\nUnabletoconnectdrivertothewindow");m_capwnd=NULL;returnFALSE;)//Setthecaptureparametersif(SetCapturePara()==FALSE)15武漢理工大學(xué)《多媒體網(wǎng)絡(luò)通信技術(shù)》大作業(yè)(//log.WriteString("\nSettingcaptureparametersfailed");capDriverDisconnect(m_capwnd);//使捕獲窗口與一個(gè)捕獲設(shè)備斷開returnFALSE;)returnTRUE;視頻捕獲驅(qū)動視頻捕獲必須具有視頻捕獲驅(qū)動才能進(jìn)行,其相關(guān)內(nèi)容如下:視頻捕獲驅(qū)動的性能,capDriverGetCap函數(shù)得到當(dāng)前連接視頻驅(qū)動的硬件性能,該信息保存在CAPDRIVERCAPS結(jié)構(gòu)中;視頻對話框,每個(gè)視頻驅(qū)動能夠提供4個(gè)對話框來控制視頻捕獲和數(shù)字化處理視頻對話框定義的視頻壓縮率和圖像品質(zhì)等。視頻對話框都在視頻捕獲驅(qū)動中定義。這個(gè)四個(gè)對話框分別為:VideoSource對話框用于控制選擇視頻來源(capDlgVideoSource);VideoFormat對話框定義視頻幀的尺寸和精度,以及視頻捕獲卡的壓縮設(shè)置(capDlgVideoFormat);VideoDisplay對話框控制在視頻捕獲期間相關(guān)顯示器上的顯示(capDlgVideoDisplay);VideoCompression對話框控制壓縮和圖像品質(zhì)(caoDlgVideoCompression)。語音錄制在音頻的錄制和播放時(shí),采用的用戶界面線程來處理,是CWinThread對象,根據(jù)前面線程的介紹,一步一步的來實(shí)現(xiàn)。錄音用的一個(gè)CWinThread對象CAudioRec來實(shí)現(xiàn),部分實(shí)現(xiàn)代碼:LRESULTCAudioRec::OnStartRecording(WPARAMwp,LPARAMlp)(if(recording)returnFALSE;〃打開錄音設(shè)備16武漢理工大學(xué)《多媒體網(wǎng)絡(luò)通信技術(shù)》大作業(yè)MMRESULTmmReturn=::waveInOpen(&m_hRecord,WAVE_MAPPER,&m_WaveFormatEx,::GetCurrentThreadId(),0,CALLBACK_THREAD);if(mmReturn!=MMSYSERR_NOERROR)returnFALSE;if(mmReturn==MMSYSERR_NOERROR)(for(inti=0;i<MAXRECBUFFER;i++)(〃為錄音設(shè)備準(zhǔn)備緩存mmReturn=::waveInPrepareHeader(m_hRecord,rechead[i],sizeof(WAVEHDR));〃給輸入設(shè)備增加一個(gè)緩存mmReturn=::waveInAddBuffer(m_hRecord,rechead[i],sizeof(WAVEHDR));)mmReturn=::waveInStart(m_hRecord); //開始錄音if(mmReturn==MMSYSERR_NOERROR)recording=TRUE;)returnTRUE;)語音播放同樣用的一個(gè)CWinThread對象CAudioPlay來實(shí)現(xiàn),部分實(shí)現(xiàn)代碼:LRESULTCAudioPlay::OnWriteSoundData(WPARAMwParam,LPARAMlParam)(//TRACE("CAudioPlay::OnWriteSoundData\n");MMRESULTmmResult=FALSE;char*p=NULL;17武漢理工大學(xué)《多媒體網(wǎng)絡(luò)通信技術(shù)》大作業(yè)intlength=(int)wParam;if(Playing==FALSE)returnFALSE;if(length<=0)returnFALSE;WAVEHDR*lpHdr=newWAVEHDR;if(!lpHdr)returnFALSE;p=newchar[length];if(!p){deletelpHdr;returnFALSE;}ZeroMemory(lpHdr,sizeof(WAVEHDR));ZeroMemory(p,length);CopyMemory(p,(char*)lParam,length);lpHdr->lpData=p;lpHdr->dwBufferLength=length;mmResult=::waveOutPrepareHeader(m_hPlay,lpHdr,sizeof(WAVEHDR));〃為回放設(shè)備準(zhǔn)備內(nèi)存塊if(mmResult){deletelpHdr;deletep;returnmmResult;}mmResult=::waveOutWrite(m_hPlay,lpHdr,sizeof(WAVEHDR));//寫數(shù)據(jù)(放音)if(mmResult){deletelpHdr;deletep;returnmmResult;}m_Count++;returnMMSYSERR_NOERROR;18武漢理工大學(xué)《多媒體網(wǎng)絡(luò)通信技術(shù)》大作業(yè)視音頻的傳輸視頻采集采用AVICap從視頻采集卡捕獲視頻圖像,得到的是位圖形式的視頻幀,然后用Divx編碼器進(jìn)行壓縮,壓縮以后形成以幀為格式的Mpeg4流。通過Winsock實(shí)現(xiàn)壓縮后的視頻數(shù)據(jù)在局域網(wǎng)中的實(shí)時(shí)傳輸,接收完的數(shù)據(jù)交給Divx解碼器,以幀的格式解壓,最后實(shí)現(xiàn)視頻顯示。所以提出以幀為單位發(fā)送視頻數(shù)據(jù)流。為了在接收端能夠方便地提取出一幀,提出如表4.1所示的格式組建幀。完整的一幀由5個(gè)字段組成,各個(gè)字段的意義如下:幀開始標(biāo)志:標(biāo)志著一幀地開始,占用4個(gè)字節(jié)的空間;幀大?。罕硎菊麄€(gè)幀的大小,包括5個(gè)字段的大小,占用4個(gè)字節(jié)的空間;幀編號:表示幀的順序編號,占用4個(gè)字節(jié)的空間;幀類型:標(biāo)志此幀是否是關(guān)鍵幀,占用1個(gè)字節(jié)的空間;幀數(shù)據(jù):存放壓縮后一幀的完整數(shù)據(jù)。處理視頻傳輸如下圖。圖4.7視頻傳輸圖相對于視頻的傳輸,語音的傳輸就簡單得多了,在這里建立了兩個(gè)線程來處理,先來用一個(gè)語音錄制線程在一個(gè)客戶端錄制語音,再通過用G729a對語音進(jìn)行編碼,然后傳輸?shù)搅硪豢蛻舳耍瑯佑肎729a對語音進(jìn)行解碼,然后用一個(gè)語音回放線程將語音播放出來。19武漢理工大學(xué)《多媒體網(wǎng)絡(luò)通信技術(shù)》大作業(yè).系統(tǒng)測試與評價(jià)測試拷貝客戶端與服務(wù)器端到兩臺配置如下的計(jì)算機(jī)上:硬件環(huán)境:CPU:IntelPentiumlll或者Pentium41GHz內(nèi)存:256MB以上硬盤:20GB以上其它:分別配有攝像頭、麥克風(fēng)、音響或者耳機(jī)等外部設(shè)備軟件環(huán)境:WindowsXP操作系統(tǒng)分別運(yùn)行兩個(gè)客戶端和一個(gè)服務(wù)器端,使用A客戶端向B客戶端發(fā)送消息,A可以正常發(fā)送消息并可以顯示消息,B可以接收到信息并顯示。服務(wù)器端維護(hù)的在線用戶信息正常,客戶端接收到的在線用戶信息與服務(wù)器端相同,在有一個(gè)客戶端下線或上線時(shí),可以在一定的時(shí)間內(nèi)得到更新,說明服務(wù)器端可以正常維護(hù)在線用戶列表,并將在線用戶列表正常的發(fā)送到客戶端。此外,AB可以進(jìn)行語音視頻聊天。圖5.1語音視頻聊天窗口
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年家禽訂購合同
- 房屋改建合同范例
- 2024電子教學(xué)設(shè)備采購合同
- 2024上海出租合同范本
- 工行委托貸款合同
- 2024紅磚購銷合同(墻地磚類)范本
- 2024【內(nèi)外粉刷合同協(xié)議書】內(nèi)墻粉刷合同范本
- 短期臨時(shí)工作合同協(xié)議
- 2024保險(xiǎn)代理協(xié)議書
- 廣東省東莞市七年級上學(xué)期語文期中考試試卷3套【附答案】
- 模板支架及腳手架安全使用培訓(xùn)課件
- 企業(yè)財(cái)產(chǎn)保險(xiǎn)投保單
- CT報(bào)告單模板精編版
- 柿子品種介紹PPT課件
- 內(nèi)鏡清潔消毒登記表格模板
- 天然氣脫硫(課堂運(yùn)用)
- 幼兒園教師師德師風(fēng)考核表(共2頁)
- 城鎮(zhèn)職工醫(yī)療保險(xiǎn)運(yùn)行中的問題分析及措施
- 阿拉丁神燈介紹ppt[共27頁]
- 學(xué)校食堂五常法管理制度
- 畢業(yè)設(shè)計(jì)500kv變電站設(shè)計(jì)
評論
0/150
提交評論