![武漢理工大學(xué) 多媒體大作業(yè)_第1頁(yè)](http://file4.renrendoc.com/view/9d3cceab3b413ed0c451bda29f75c94b/9d3cceab3b413ed0c451bda29f75c94b1.gif)
![武漢理工大學(xué) 多媒體大作業(yè)_第2頁(yè)](http://file4.renrendoc.com/view/9d3cceab3b413ed0c451bda29f75c94b/9d3cceab3b413ed0c451bda29f75c94b2.gif)
![武漢理工大學(xué) 多媒體大作業(yè)_第3頁(yè)](http://file4.renrendoc.com/view/9d3cceab3b413ed0c451bda29f75c94b/9d3cceab3b413ed0c451bda29f75c94b3.gif)
![武漢理工大學(xué) 多媒體大作業(yè)_第4頁(yè)](http://file4.renrendoc.com/view/9d3cceab3b413ed0c451bda29f75c94b/9d3cceab3b413ed0c451bda29f75c94b4.gif)
![武漢理工大學(xué) 多媒體大作業(yè)_第5頁(yè)](http://file4.renrendoc.com/view/9d3cceab3b413ed0c451bda29f75c94b/9d3cceab3b413ed0c451bda29f75c94b5.gif)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、多媒體網(wǎng)絡(luò)通信技術(shù)大作業(yè)1、題目:基于局域網(wǎng)的可視對(duì)講系統(tǒng)設(shè)計(jì)2、系統(tǒng)開(kāi)發(fā)環(huán)境與工具:(1)、硬件環(huán)境:實(shí)驗(yàn)室局域網(wǎng)(2)、軟件環(huán)境:WindowsXP操作系統(tǒng)(3)、開(kāi)發(fā)工具:自己熟悉的面向?qū)ο蟮木W(wǎng)絡(luò)通信編程工具與平臺(tái),相關(guān)音頻、視頻編碼與傳輸協(xié)議類(lèi)庫(kù)3、要求與評(píng)分標(biāo)準(zhǔn):(1)要求:在以上硬軟件環(huán)境下,利用合適的開(kāi)發(fā)工具,設(shè)計(jì)一套可視對(duì)講軟件,實(shí)現(xiàn)局域網(wǎng)內(nèi)兩臺(tái)計(jì)算機(jī)之間的可視對(duì)講功能,要求音視頻信號(hào)連續(xù)性、實(shí)時(shí)性較好,滿(mǎn)足正常交流需要。(2)評(píng)分標(biāo)準(zhǔn)系統(tǒng)原理分析(20分)1.系統(tǒng)原理概述(10分)2.關(guān)鍵技術(shù)分析(10分)系統(tǒng)總體方案設(shè)計(jì)(30分)1.按模塊化設(shè)計(jì)要求畫(huà)系統(tǒng)結(jié)構(gòu)圖(15分)2
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)測(cè)試與評(píng)價(jià)(20)實(shí)現(xiàn)語(yǔ)音通信(6分)實(shí)現(xiàn)視頻通信(6分)實(shí)現(xiàn)音視頻同步(8分)TOC o 1-5 h z HYPERLINK l bookmark0 摘要1.軟件開(kāi)發(fā)工具2WIN32SDK編程2 HYPERLINK l bookmark5 TCP/IP協(xié)議及WINDOWSSOCKETS網(wǎng)絡(luò)編程接口3TCP/IP協(xié)議簡(jiǎn)介3Windows
3、Socket網(wǎng)絡(luò)編程簡(jiǎn)介4 HYPERLINK l bookmark7 VC+6.0簡(jiǎn)介4 HYPERLINK l bookmark9 VideoforWindows簡(jiǎn)介5 HYPERLINK l bookmark11 G729.dll的簡(jiǎn)介5 HYPERLINK l bookmark13 LanMsgLibrary.dll的簡(jiǎn)介6 HYPERLINK l bookmark15 .系統(tǒng)原理分析7 HYPERLINK l bookmark17 系統(tǒng)原理概述7 HYPERLINK l bookmark19 關(guān)鍵技術(shù)分析7 HYPERLINK l bookmark25 .系統(tǒng)總體方案設(shè)計(jì)8 HYPE
4、RLINK l bookmark27 系統(tǒng)功能模塊圖8 HYPERLINK l bookmark29 語(yǔ)音聊天過(guò)程分析9 HYPERLINK l bookmark31 視頻聊天過(guò)程分析10 HYPERLINK l bookmark33 .系統(tǒng)具體設(shè)計(jì)11 HYPERLINK l bookmark35 語(yǔ)音視頻聊天的實(shí)現(xiàn)11 HYPERLINK l bookmark37 視頻的捕捉11 HYPERLINK l bookmark39 窗口的捕捉14 HYPERLINK l bookmark41 視頻捕獲驅(qū)動(dòng)16 HYPERLINK l bookmark43 語(yǔ)音錄制16 HYPERLINK l b
5、ookmark45 語(yǔ)音播放17 HYPERLINK l bookmark47 視音頻的傳輸19 HYPERLINK l bookmark49 .系統(tǒng)測(cè)試與評(píng)價(jià)20 HYPERLINK l bookmark51 測(cè)試20 HYPERLINK l bookmark53 測(cè)試結(jié)果分析21.心得體會(huì)22.參考文獻(xiàn)23 軟件開(kāi)發(fā)工具WIN32SDK編程所謂的Win32開(kāi)發(fā),就是在C+語(yǔ)言的層面上,直接使用Win32API(ApplicationProgrammingInterface:系統(tǒng)開(kāi)放出來(lái),給程序員使用的接口。)開(kāi)發(fā)Windows應(yīng)用程序或者系統(tǒng)程序。所謂的Win32,其實(shí)是一個(gè)API規(guī)范,與
6、UNIX系統(tǒng)編程接口標(biāo)準(zhǔn)POSIX是相對(duì)應(yīng)的。下面是進(jìn)行直接的Win32SDK方式編程的基本思路或者說(shuō)是一個(gè)框架。一個(gè)Windows程序分為程序代碼和UI(UserInterface用戶(hù)界面)資源兩大部分,兩部分最后以RC編譯程序編譯為一個(gè)完整的EXE文件。所謂UI資源是指功能菜單、對(duì)話框外貌、程序圖標(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è)完整
7、的Windows可執(zhí)行文件。LWinMain函數(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)體來(lái)表示的。注冊(cè)窗口RegisterClass()完成注冊(cè)窗口類(lèi)的功能,設(shè)定窗口的屬性:邊框、顏色、標(biāo)題、位置等等。創(chuàng)建窗口CreateWindow函數(shù)可以用于創(chuàng)建父窗口、彈出窗口以及子窗口,在創(chuàng)建窗口時(shí)它可以確定窗口類(lèi)、窗口標(biāo)題、窗口風(fēng)格、大小以及初始化位置。顯示窗口創(chuàng)建窗口后需要使用ShowWindow函數(shù)用于顯示窗口。6、刷新窗口調(diào)用Upda
8、teWindow函數(shù)來(lái)刷新窗口。消息循環(huán)初始化工作完成后,亞皿忖2皿進(jìn)入所謂的消息循環(huán),使用while循環(huán),不斷的GetMessage,再使用TranslateMessage將消息轉(zhuǎn)化,用DispatchMessage將消息傳遞給窗口函數(shù)去處理。獲取消息GetMessage功能函數(shù)從消息隊(duì)列中獲取消息,如果消息隊(duì)列中沒(méi)有消息,此功能函數(shù)則會(huì)一直等得消息。轉(zhuǎn)換消息將特定的消息轉(zhuǎn)換為不同的消息,例如消息隊(duì)列中同時(shí)有WM_KEYDOWN和WM_KEYUP消息時(shí),意味著用戶(hù)同時(shí)按下了鍵盤(pán)上的某幾個(gè)鍵,此時(shí)TranslateMessage將其轉(zhuǎn)換為一個(gè)WM_CHAR消息。將消息發(fā)送到回調(diào)函數(shù)Dispat
9、chMessage通過(guò)USER模塊的協(xié)助將消息送到該窗口的窗口函數(shù)去了,但是DispatchMessage并沒(méi)有指定函數(shù)名,卻可以將消息傳送過(guò)去,這是因?yàn)橄l(fā)生的時(shí)候,OS已經(jīng)根據(jù)當(dāng)時(shí)狀態(tài),為它標(biāo)明了所屬窗口,而窗口所屬的窗口類(lèi)亦是明確的。WinMain函數(shù)返回值returnmsg.wParam;返回結(jié)構(gòu)體變量msg中的wParam的值。WindowProc窗口函數(shù)窗口中的生命樞紐:窗口函數(shù)WindowProc。WindowProc是一個(gè)callback函數(shù),常利用switch/case方式判斷消息的種類(lèi),以決定處理方式。TCP/IP協(xié)議及WINDOWSSOCKETS網(wǎng)絡(luò)編程接口TCP/IP
10、協(xié)議簡(jiǎn)介T(mén)CP/IP已成為當(dāng)今計(jì)算機(jī)網(wǎng)絡(luò)最成熟、應(yīng)用最廣的互聯(lián)協(xié)議。Internet采用的就是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(UserDatagramProtoco)協(xié)議、ICMP(InternetControlMessageProtoc)o協(xié)議、A
11、RP(地址解析協(xié)議)和其他一些協(xié)議的協(xié)議組。TCP和IP兩個(gè)協(xié)議分別屬于傳輸層和網(wǎng)絡(luò)層,在Internet中起著不同的作用。WindowsSocket網(wǎng)絡(luò)編程簡(jiǎn)介Socket實(shí)際在計(jì)算機(jī)中提供了一個(gè)通信端口,可以通過(guò)這個(gè)端口與任何一個(gè)具有Socket接口的計(jì)算機(jī)通信。應(yīng)用程序在網(wǎng)絡(luò)上傳輸,接收的信息都通過(guò)這個(gè)Socket接口來(lái)實(shí)現(xiàn)。WindowsSockets規(guī)范定義了一套開(kāi)放的、支持多種協(xié)議的、Windows下的網(wǎng)絡(luò)編程接口。它不僅包含了人們所熟悉的BerkeleySocket風(fēng)格的庫(kù)函數(shù),也包含了一組針對(duì)Windows的擴(kuò)展庫(kù)函數(shù),使得程序員能充分地利用Windows消息驅(qū)動(dòng)機(jī)制進(jìn)行編程。
12、現(xiàn)在的WindowsSockets已經(jīng)基本上實(shí)現(xiàn)了與協(xié)議無(wú)關(guān),你可以使用WindowsSockets來(lái)調(diào)用多種協(xié)議的功能,但較常使用的是TCP/IP協(xié)議。VC+6.0簡(jiǎn)介我們通常所說(shuō)的VisualC+實(shí)際上是一個(gè)完善的、非常強(qiáng)大的C+程序開(kāi)發(fā)環(huán)境,它的名字是MicrosoftDeveloperStudio。二者之間的細(xì)小差別并不重要,通常這兩個(gè)術(shù)語(yǔ)可以互換。但如果你不圍繞DeveloperStudio來(lái)進(jìn)行學(xué)習(xí),就不能有效地使用VisualC+(DeveloperStudio聽(tīng)起來(lái)很像VisualStudio,但它們之間沒(méi)有關(guān)系)。它包含:C+編譯器、調(diào)試器、應(yīng)用程序框架生成器、項(xiàng)目管理器、設(shè)
13、計(jì)和實(shí)現(xiàn)菜單等資源的編輯器等等。VideoforWindows簡(jiǎn)介VFW是Microsoft1992年推出的關(guān)于數(shù)字視頻的一個(gè)軟件包,它能使應(yīng)用程序數(shù)字化并播放從傳統(tǒng)模擬視頻源得到的視頻剪輯。VFW的一個(gè)關(guān)鍵思想是播放時(shí)不需要專(zhuān)用硬件,為了解決數(shù)字視頻數(shù)據(jù)量大的問(wèn)題,需要對(duì)數(shù)據(jù)進(jìn)行壓縮。它引進(jìn)了一種叫AVI的文件標(biāo)準(zhǔn),該標(biāo)準(zhǔn)未規(guī)定如何對(duì)視頻進(jìn)行捕獲、壓縮及播放,僅規(guī)定視頻和音頻該如何存儲(chǔ)在硬盤(pán)上,在AVI文件中交替存儲(chǔ)視頻幀和與之相匹配的音頻數(shù)據(jù)。VFW給程序員提供.VBX和AVICap窗口類(lèi)的高級(jí)編程工具,使程序員能通過(guò)發(fā)送消息或設(shè)置屬性來(lái)捕獲、播放和編輯視頻剪輯?,F(xiàn)在用戶(hù)不必專(zhuān)門(mén)安裝VFW
14、了,Windows95本身包括了VideoforWindowsl.1,當(dāng)用戶(hù)在安裝Windows時(shí),安裝程序會(huì)自動(dòng)地安裝配置視頻所需的組件,如設(shè)備驅(qū)動(dòng)程序、視頻壓縮程序等。VFW主要由以下六個(gè)模塊組成:(1)AVICAP.DLL:包含了執(zhí)行視頻捕獲的函數(shù),它給AVI文件I/O和視頻、音頻設(shè)備驅(qū)動(dòng)程序提供一個(gè)高級(jí)接口。(2)MSVIDEO.DLL:用一套特殊的DrawDib函數(shù)來(lái)處理屏幕上的視頻操作。(3)MCIAVI.DRV:此驅(qū)動(dòng)程序包括對(duì)VFW的MCI命令的解釋器。(4)AVIFILE.DLL:支持由標(biāo)準(zhǔn)多媒體I/O(mmio)函數(shù)提供的更高的命令來(lái)訪問(wèn).AVI文件。(5)壓縮管理器(IC
15、M):管理用于視頻壓縮一解壓縮的編解碼器(CODEC)。(6)音頻壓縮管理器ACM:提供與ICM相似的服務(wù),不同的是它適于波形音頻。G729.dll的簡(jiǎn)介G.729算法是ITU-T制定的編碼速率為8kb/s的共軛結(jié)構(gòu)碼激勵(lì)線性預(yù)測(cè)聲碼器語(yǔ)音編碼算法標(biāo)準(zhǔn),作為低速率的語(yǔ)音編碼器,在傳輸?shù)膸捰邢薜那闆r下運(yùn)用越來(lái)越受到廣泛的重視。G729系列算法聲碼器的原理都是相通的,各種算法不同之處在于算法的簡(jiǎn)化和編碼比特的多少。G.729編碼器是基于碼激勵(lì)線性預(yù)測(cè)(CELP)聲碼器模型的。這個(gè)編碼器運(yùn)算的幀長(zhǎng)為10ms,相應(yīng)于抽樣率為8000kHz的語(yǔ)音數(shù)據(jù)流的80個(gè)樣值,具有8kbit/s的編碼速率,較低的
16、延遲和高編碼語(yǔ)音質(zhì)量等優(yōu)點(diǎn)。本程序在語(yǔ)音聊天模塊中,調(diào)用了G729.dll動(dòng)態(tài)鏈接庫(kù)文件,它包括G.729的函數(shù)和資源,是一種可執(zhí)行文件,它允許程序共享執(zhí)行特殊任務(wù)所必需的代碼和其他資源。LanMsgLibrary.dll該聊天軟件系統(tǒng)的語(yǔ)音聊天、視頻聊天功能的實(shí)現(xiàn)主要是引用了LanMsgLibrary.dll這個(gè)動(dòng)態(tài)鏈接庫(kù)文件,它包括VFW以及其他相關(guān)的函數(shù)與資源。在音頻與視頻聊天實(shí)現(xiàn)的過(guò)程中,程序就引用了LanMsgLibrary.dll中的VFW以及相關(guān)的函數(shù)和資源。在視頻聊天過(guò)程中,主要實(shí)現(xiàn)了視頻的捕獲與播放,視頻流的壓縮與解壓。在語(yǔ)音聊天過(guò)程中,主要實(shí)現(xiàn)了聲音的采集與播放,通過(guò)調(diào)用了
17、G729.dll動(dòng)態(tài)鏈接庫(kù)文件,對(duì)音頻進(jìn)行了壓縮與解壓。在整個(gè)語(yǔ)音聊天與視頻聊天實(shí)現(xiàn)的過(guò)程中,程序主要對(duì)LanMsgLibrary.dll的引用來(lái)實(shí)現(xiàn)其功能。2.系統(tǒng)原理分析系統(tǒng)原理概述從技術(shù)上而言,音視頻通信技術(shù),涉及音視頻設(shè)備操作、音視頻流編解碼、媒體流網(wǎng)絡(luò)傳輸、流媒體接受處理等相關(guān)技術(shù)。另外,由于媒體流信息量大,及時(shí)要求度高,還要保障媒體幀的流暢性,這就對(duì)依賴(lài)于高速網(wǎng)絡(luò)、高性能的硬件設(shè)備以及相關(guān)媒體流網(wǎng)絡(luò)包的建包和解包算法。關(guān)鍵技術(shù)分析對(duì)于一個(gè)端對(duì)端的語(yǔ)音聊天系統(tǒng)來(lái)說(shuō),主要涉及兩個(gè)方面的動(dòng)作,即語(yǔ)音的采集和播放、語(yǔ)音數(shù)據(jù)的發(fā)送和接收。系統(tǒng)采用多線程的設(shè)計(jì)思想來(lái)完成并協(xié)調(diào)各個(gè)過(guò)程。語(yǔ)音的采
18、集實(shí)際上就是一個(gè)音頻壓縮的過(guò)程。語(yǔ)音的播放是聲音數(shù)據(jù)流的還原過(guò)程,通過(guò)一個(gè)父線程讀取接收線程接收到的數(shù)據(jù),并通過(guò)管道讓其子線程播放解壓后的聲音數(shù)據(jù)。語(yǔ)音數(shù)據(jù)的發(fā)送和接收主要用Socket編程來(lái)實(shí)現(xiàn),socket是網(wǎng)絡(luò)通訊過(guò)程中端點(diǎn)的抽象表示。為了通過(guò)socket接口進(jìn)行網(wǎng)絡(luò)通訊,程序在對(duì)話的每一端都需要一個(gè)socket,兩個(gè)socket采用無(wú)連接的UDP協(xié)議。視頻模塊的設(shè)計(jì)思想與語(yǔ)音模塊一致,也涉及到兩個(gè)方面的動(dòng)作,視頻的采集和播放,視頻數(shù)據(jù)的發(fā)送和接收。視頻的采集與播放是基于VFW來(lái)實(shí)現(xiàn)的,利用VFW的關(guān)于數(shù)字視頻的軟件包實(shí)現(xiàn)對(duì)視頻的采集與播放。視頻數(shù)據(jù)的發(fā)送與接收同樣采用了Socket編程
19、,在發(fā)送視頻時(shí),通過(guò)Socket端口進(jìn)行監(jiān)聽(tīng)。當(dāng)收到對(duì)方發(fā)送的包含視頻請(qǐng)求信息和對(duì)方IP地址、端口號(hào)等信息后,如果同意請(qǐng)求,則向請(qǐng)求方發(fā)送包含了本地IP、端口號(hào)的接受視頻信息,這樣就建立了連接,開(kāi)始視頻聊天。TCP/IP是一組用于實(shí)現(xiàn)網(wǎng)絡(luò)互連的通信協(xié)議。Internet網(wǎng)絡(luò)體系結(jié)構(gòu)以TCP/IP為核心?;赥CP/IP的參考模型將協(xié)議分成四個(gè)層次,它們分別是:網(wǎng)絡(luò)訪問(wèn)層、網(wǎng)際互連層、傳輸層(主機(jī)到主機(jī))、和應(yīng)用層。UDP協(xié)議的全稱(chēng)是用戶(hù)數(shù)據(jù)包協(xié)議,在網(wǎng)絡(luò)中它與TCP協(xié)議一樣用于處理數(shù)據(jù)包,是一種無(wú)連接的協(xié)議。3.3.系統(tǒng)總體方案設(shè)計(jì)1系統(tǒng)功能模塊圖圖3.1.2語(yǔ)音視頻聊天流程圖語(yǔ)音聊天過(guò)程分析
20、用戶(hù)1通過(guò)麥克對(duì)自己的聲音進(jìn)行采集,在通過(guò)壓縮,使其在網(wǎng)絡(luò)上傳輸?shù)男矢?,然后再進(jìn)行傳輸,當(dāng)用戶(hù)2接收到用戶(hù)1的聲音數(shù)據(jù)后將其解壓,然后進(jìn)行播放。圖3.2.1語(yǔ)音模塊數(shù)據(jù)流程圖在進(jìn)行語(yǔ)音聊天時(shí),兩臺(tái)計(jì)算機(jī)必須先要建立連接,如圖5所示,用戶(hù)1向用戶(hù)2發(fā)送“發(fā)送語(yǔ)音請(qǐng)求”信息,用戶(hù)2收到用戶(hù)1請(qǐng)求信息后,發(fā)送回應(yīng)信息給用戶(hù)1,如果用戶(hù)2同意,開(kāi)始語(yǔ)音聊天;不同意,停止語(yǔ)音聊天。圖3.2.2語(yǔ)音聊天建立連接圖視頻聊天過(guò)程分析用戶(hù)1通過(guò)攝像頭進(jìn)行視頻采集,經(jīng)過(guò)壓縮后,向用戶(hù)2發(fā)送采集后的視頻數(shù)據(jù)。用戶(hù)2接收到用戶(hù)1發(fā)送的視頻數(shù)據(jù)并將其進(jìn)行解壓,然后在用戶(hù)2的采集窗口上播放,這樣視頻的傳輸就完成了。視
21、頻模塊數(shù)據(jù)傳輸流程如圖3所示。圖3.3.1視頻模塊數(shù)據(jù)傳輸流程圖在進(jìn)行視頻數(shù)據(jù)傳輸前,兩臺(tái)計(jì)算機(jī)必須先要建立連接,其原理和語(yǔ)音聊天建立連接的原理一致。用戶(hù)1向用戶(hù)2發(fā)送視頻請(qǐng)求,用戶(hù)2在接收到用戶(hù)1的請(qǐng)求后,給用戶(hù)1發(fā)送收到請(qǐng)求后的回應(yīng)信息,如果同意用戶(hù)1的請(qǐng)求則用戶(hù)1與用戶(hù)2開(kāi)始視頻聊天,如果不同意就終止視頻聊天。視頻聊天建立連接如圖7所示。圖2.3.2視頻聊天建立連接圖.系統(tǒng)具體設(shè)計(jì)語(yǔ)音視頻聊天的實(shí)現(xiàn)在實(shí)現(xiàn)語(yǔ)音視頻聊天時(shí),采用的是基于UDP套接字的點(diǎn)對(duì)點(diǎn)模式,即用戶(hù)與用戶(hù)之間的數(shù)據(jù)傳輸。其套接字的使用如下圖。圖4.1語(yǔ)音視頻聊天套接字圖視頻的捕捉利用VFW接口,視頻捕獲可以分為以下幾個(gè)步驟
22、:建立視頻采集窗口:該窗口用來(lái)接收視頻捕捉驅(qū)動(dòng)程序傳來(lái)的數(shù)據(jù)和消息。連接視頻驅(qū)動(dòng)程序:將建立的視頻捕捉窗口與視頻設(shè)備驅(qū)動(dòng)程序相連。視頻捕獲初始化。視頻捕捉設(shè)置:VFW下視頻捕捉參數(shù)的設(shè)置可以通過(guò)調(diào)用函數(shù)或彈出對(duì)話框的形式來(lái)實(shí)現(xiàn)。一般視頻驅(qū)動(dòng)程序允許設(shè)置的參數(shù)包括視頻源選擇、視頻格式、視頻顯示格式等。設(shè)置回調(diào)函數(shù):通過(guò)回調(diào)函數(shù)來(lái)通知程序視頻事件的發(fā)生,比如捕捉一幀圖像成功的消息,捕捉出錯(cuò)的消息等。結(jié)束捕捉:結(jié)束捕捉是應(yīng)該有一些清除工作。如釋放分配的內(nèi)存,斷開(kāi)捕捉窗口與視頻捕捉驅(qū)動(dòng)程序的連接,清除視頻捕捉窗口等。窗口類(lèi)為捕獲數(shù)字視頻流及其相關(guān)操作提供了很大的方便,靈活編寫(xiě)其中的回調(diào)函數(shù)可滿(mǎn)足實(shí)時(shí)視
23、頻傳輸?shù)男枰?,例如?yīng)用程序可直接從緩沖中取得數(shù)字視頻并對(duì)其進(jìn)行壓縮編碼后實(shí)時(shí)地傳到遠(yuǎn)端的客戶(hù)端。在VC+中,采用VFW技術(shù),客戶(hù)端通過(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ā)送到另一客戶(hù)端。該客戶(hù)端接收完一幀以后,交給ICDecompress()解壓,最后用SetDIBitsToDevice()將圖像顯示出來(lái)?;镜牟东@設(shè)置包括設(shè)置捕獲速度(每秒捕獲多少幀)、是否同時(shí)捕獲聲頻、捕獲緩沖、允許最大丟失多少幀和是否
24、使用DOS內(nèi)存,以及使用鍵盤(pán)的哪個(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è)置。設(shè)置捕獲速度,通過(guò)使用capCaptureGetSetup宏來(lái)得到當(dāng)前的捕捉速度,將當(dāng)前的捕捉速度保存在CAPTUREPARAMS結(jié)構(gòu)的dwRequestMicroSecPerFrame成員變量中,也可以通過(guò)設(shè)置此變量來(lái)改變當(dāng)前設(shè)置值。設(shè)置終止捕獲,同樣通過(guò)使用capCaptureGetSetup宏來(lái)得到當(dāng)前的設(shè)置,當(dāng)前按鍵設(shè)置保存在CAP
25、TUREPARAMS結(jié)構(gòu)的vKeyAbort成員中,鼠標(biāo)設(shè)置保存在fAbortLeftMouse和fAbortRightMouse成員中,通過(guò)修改可以設(shè)置新的熱健或者鼠標(biāo)左右鍵,修改完成后,使用capCaptureSetSetup宏來(lái)進(jìn)行更新。捕獲的時(shí)間限制,用CAPTUREPARAMS結(jié)構(gòu)中的fLimitEnabled表示捕獲是否有時(shí)間的限制,wTimeLimit用來(lái)設(shè)置指示捕獲最大的持續(xù)時(shí)間,其單位為秒。使用capCaptureGetSetup宏來(lái)得到當(dāng)前的設(shè)置值。下面程序?yàn)樵O(shè)置CAPTUREPARAMS結(jié)構(gòu)的實(shí)現(xiàn)代碼:BOOLVideoCapture:SetCapturePara()CA
26、PTUREPARMSCapParms=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.Write
27、String(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(nVideoparamet
28、erssetproperly);returnret;/終止一個(gè)捕獲任務(wù)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ù)來(lái)使一個(gè)捕獲窗口與一個(gè)捕獲設(shè)備連接或關(guān)聯(lián)連接上后,就可以通過(guò)捕獲窗
29、口向捕獲設(shè)備發(fā)送各種消息,可以使用函數(shù)capGetDriverDescription來(lái)獲得已安裝的捕獲設(shè)備名稱(chēng)及版本,將其列舉在實(shí)現(xiàn)程序過(guò)程中。再利用capDriverGetName函數(shù)來(lái)得到捕獲設(shè)備的名稱(chēng)將獲得的版本發(fā)送到capDriverGetVersion。如果斷開(kāi)捕獲窗口與捕獲設(shè)備的連接用capDriverDisconnect。捕獲窗口的狀態(tài),用capGetStatus函數(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)該在獲
30、取捕獲設(shè)備的視頻格式以后及時(shí)進(jìn)行刷新。而捕獲窗口尺寸的改變并不影響實(shí)際的捕獲視頻流的尺寸。該尺寸由視頻捕獲設(shè)備的格式和視頻對(duì)話框決定。/捕獲窗口BOOLVideoCapture:Initialize()chardevname128=0,devversion128=0;intindex=0;BOOLret=TRUE,ret1=TRUE,ret2=TRUE,ret3=TRUE;TRACE(VideoCapture:Initializen);創(chuàng)建一個(gè)AVICap捕獲窗口m_capwnd=capCreateCaptureWindow(Capture,WS_POPUP,0,0,1,1,0,0);if(!
31、m_capwnd)returnFALSE;/connectcallbackfunctionsret=capSetUserData(m_capwnd,this);/Changedestroyfunctionsalsoret1=capSetCallbackOnVideoStream(m_capwnd,OnCaptureVideo);/得到已安裝的捕獲設(shè)備的名稱(chēng)及版本ret2=capGetDriverDescription(index,devname,100,devversion,100);/Connecttowebcamdriver/使一個(gè)捕獲窗口與一個(gè)捕獲設(shè)備連接或關(guān)聯(lián)ret3=capDrive
32、rConnect(m_capwnd,index);if(!(ret&ret1&ret2&ret3)/Devicemaybeopenalreadyoritmaynothavebeen/closedproperlylasttime.AfxMessageBox(UnabletoopenVideoCaptureDevice);/log.WriteString(nUnabletoconnectdrivertothewindow);m_capwnd=NULL;returnFALSE;/Setthecaptureparametersif(SetCapturePara()=FALSE)/log.WriteSt
33、ring(nSettingcaptureparametersfailed);capDriverDisconnect(m_capwnd);/使捕獲窗口與一個(gè)捕獲設(shè)備斷開(kāi)returnFALSE;returnTRUE;視頻捕獲驅(qū)動(dòng)視頻捕獲必須具有視頻捕獲驅(qū)動(dòng)才能進(jìn)行,其相關(guān)內(nèi)容如下:視頻捕獲驅(qū)動(dòng)的性能,capDriverGetCap函數(shù)得到當(dāng)前連接視頻驅(qū)動(dòng)的硬件性能,該信息保存在CAPDRIVERCAPS結(jié)構(gòu)中;視頻對(duì)話框,每個(gè)視頻驅(qū)動(dòng)能夠提供4個(gè)對(duì)話框來(lái)控制視頻捕獲和數(shù)字化處理視頻對(duì)話框定義的視頻壓縮率和圖像品質(zhì)等。視頻對(duì)話框都在視頻捕獲驅(qū)動(dòng)中定義。這個(gè)四個(gè)對(duì)話框分別為:VideoSource對(duì)話
34、框用于控制選擇視頻來(lái)源(capDlgVideoSource);VideoFormat對(duì)話框定義視頻幀的尺寸和精度,以及視頻捕獲卡的壓縮設(shè)置(capDlgVideoForm;aW)ideoDisplay對(duì)話框控制在視頻捕獲期間相關(guān)顯示器上的顯示(capDlgVideoDispl;aW)ideoCompressio對(duì)話框控制壓縮和圖像品質(zhì)(caoDlgVideoCompression)語(yǔ)音錄制在音頻的錄制和播放時(shí),采用的用戶(hù)界面線程來(lái)處理,是CWinThread對(duì)象,根據(jù)前面線程的介紹,一步一步的來(lái)實(shí)現(xiàn)。錄音用的一個(gè)CWinThread對(duì)象CAudioRec來(lái)實(shí)現(xiàn),部分實(shí)現(xiàn)代碼:LRESULTCA
35、udioRec:OnStartRecording(WPARAMwp,LPARAMlp)if(recording)returnFALSE;/打開(kāi)錄音設(shè)備MMRESULTmmReturn=:waveInOpen(&m_hRecord,WAVE_MAPPER,&m_WaveFormatEx,:GetCurrentThreadId(),0,CALLBACK_THREAD);if(mmReturn!=MMSYSERR_NOERROR)returnFALSE;if(mmReturn=MMSYSERR_NOERROR)for(inti=0;iMAXRECBUFFER;i+)/為錄音設(shè)備準(zhǔn)備緩存mmRetur
36、n=:waveInPrepareHeader(m_hRecord,recheadi,sizeof(WAVEHDR);/給輸入設(shè)備增加一個(gè)緩存mmReturn=:waveInAddBuffer(m_hRecord,recheadi,sizeof(WAVEHDR);mmReturn=:waveInStart(m_hRecord);/開(kāi)始錄音if(mmReturn=MMSYSERR_NOERROR)recording=TRUE;returnTRUE;語(yǔ)音播放同樣用的一個(gè)CWinThread對(duì)象CAudioPlay來(lái)實(shí)現(xiàn),部分實(shí)現(xiàn)代碼:LRESULTCAudioPlay:OnWriteSoundDat
37、a(WPARAMwParam,LPARAMlParam)/TRACE(CAudioPlay:OnWriteSoundDatan);MMRESULTmmResult=FALSE;char*p=NULL;intlength=(int)wParam;if(Playing=FALSE)returnFALSE;if(lengthlpData=p;lpHdr-dwBufferLength=length;mmResult=:waveOutPrepareHeader(m_hPlay,lpHdr,sizeof(WAVEHDR);/為回放設(shè)備準(zhǔn)備內(nèi)存塊if(mmResult)deletelpHdr;deletep
38、;returnmmResult;mmResult=:waveOutWrite(m_hPlay,lpHdr,sizeof(WAVEHDR);/寫(xiě)數(shù)據(jù)(放音)if(mmResult)deletelpHdr;deletep;returnmmResult;m_Count+;returnMMSYSERR_NOERROR;視音頻的傳輸視頻采集采用AVICap從視頻采集卡捕獲視頻圖像,得到的是位圖形式的視頻幀,然后用Divx編碼器進(jìn)行壓縮,壓縮以后形成以幀為格式的Mpeg4流。通過(guò)Winsock實(shí)現(xiàn)壓縮后的視頻數(shù)據(jù)在局域網(wǎng)中的實(shí)時(shí)傳輸,接收完的數(shù)據(jù)交給Divx解碼器,以幀的格式解壓,最后實(shí)現(xiàn)視頻顯示。所以提
39、出以幀為單位發(fā)送視頻數(shù)據(jù)流。為了在接收端能夠方便地提取出一幀,提出如表4.1所示的格式組建幀。完整的一幀由5個(gè)字段組成,各個(gè)字段的意義如下:幀開(kāi)始標(biāo)志:標(biāo)志著一幀地開(kāi)始,占用4個(gè)字節(jié)的空間;幀大小:表示整個(gè)幀的大小,包括5個(gè)字段的大小,占用4個(gè)字節(jié)的空間;幀編號(hào):表示幀的順序編號(hào),占用4個(gè)字節(jié)的空間;幀類(lèi)型:標(biāo)志此幀是否是關(guān)鍵幀,占用1個(gè)字節(jié)的空間;幀數(shù)據(jù):存放壓縮后一幀的完整數(shù)據(jù)。處理視頻傳輸如下圖。圖4.7視頻傳輸圖相對(duì)于視頻的傳輸,語(yǔ)音的傳輸就簡(jiǎn)單得多了,在這里建立了兩個(gè)線程來(lái)處理,先來(lái)用一個(gè)語(yǔ)音錄制線程在一個(gè)客戶(hù)端錄制語(yǔ)音,再通過(guò)用G729a對(duì)語(yǔ)音進(jìn)行編碼,然后傳輸?shù)搅硪豢蛻?hù)端,同樣用
40、G729a對(duì)語(yǔ)音進(jìn)行解碼,然后用一個(gè)語(yǔ)音回放線程將語(yǔ)音播放出來(lái)。.系統(tǒng)測(cè)試與評(píng)價(jià)測(cè)試拷貝客戶(hù)端與服務(wù)器端到兩臺(tái)配置如下的計(jì)算機(jī)上:硬件環(huán)境:CPU:IntelPentiumlll或者Pentium41GHz內(nèi)存:256MB以上硬盤(pán):20GB以上其它:分別配有攝像頭、麥克風(fēng)、音響或者耳機(jī)等外部設(shè)備軟件環(huán)境:WindowsXP操作系統(tǒng)分別運(yùn)行兩個(gè)客戶(hù)端和一個(gè)服務(wù)器端,使用A客戶(hù)端向B客戶(hù)端發(fā)送消息,A可以正常發(fā)送消息并可以顯示消息,B可以接收到信息并顯示。服務(wù)器端維護(hù)的在線用戶(hù)信息正常,客戶(hù)端接收到的在線用戶(hù)信息與服務(wù)器端相同,在有一個(gè)客戶(hù)端下線或上線時(shí),可以在一定的時(shí)間內(nèi)得到更新,說(shuō)明服務(wù)器端可以正常維護(hù)在線用戶(hù)列表,并將在線用戶(hù)列表正常的發(fā)送到客戶(hù)端。此外,AB可以進(jìn)行語(yǔ)音視頻聊天。圖5.1語(yǔ)音視頻聊天窗口如圖5.1所示,進(jìn)入到與好友的對(duì)話界面后,如果想與好友進(jìn)行語(yǔ)音、視頻聊天,那么單擊該界面上的“請(qǐng)求視頻”按鈕,好友就會(huì)收到你請(qǐng)求視頻聊天信息的對(duì)話框,好友同意,則單擊接收視頻按鈕,兩人就可以進(jìn)行視頻、語(yǔ)音聊天了。在界面的話筒和喇叭的圖片旁邊有兩個(gè)調(diào)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國(guó)奶嘴夾市場(chǎng)調(diào)查研究報(bào)告
- 2025年中國(guó)前防塵蓋市場(chǎng)調(diào)查研究報(bào)告
- 廣州廣東廣州海洋地質(zhì)調(diào)查局招聘交流選調(diào)人員筆試歷年參考題庫(kù)附帶答案詳解
- 2025至2031年中國(guó)脫水提升機(jī)行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- 2025年測(cè)油液位計(jì)項(xiàng)目可行性研究報(bào)告
- 2025至2031年中國(guó)檸檬梅行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- 2025年家用迷你型數(shù)字電視機(jī)頂盒項(xiàng)目可行性研究報(bào)告
- 2025至2031年中國(guó)光電纜附件行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- 2025年全面雙絲光針織面料項(xiàng)目可行性研究報(bào)告
- 2025年不銹鋼不粘鍋?lái)?xiàng)目可行性研究報(bào)告
- 多源數(shù)據(jù)整合
- 新人教版高中數(shù)學(xué)必修第二冊(cè)第六章平面向量及其應(yīng)用教案 (一)
- 《預(yù)防流感》主題班會(huì)教案3篇
- 校園招聘活動(dòng)策劃方案(6篇)
- 期末 (試題) -2024-2025學(xué)年教科版(廣州)英語(yǔ)四年級(jí)上冊(cè)
- 解讀國(guó)有企業(yè)管理人員處分條例課件
- 湖南省長(zhǎng)沙市一中2024-2025學(xué)年高一生物上學(xué)期期末考試試題含解析
- 小孩使用手機(jī)協(xié)議書(shū)范本
- 榆神礦區(qū)郭家灘煤礦(700 萬(wàn)噸-年)項(xiàng)目環(huán)評(píng)
- 2024年200MW-400MWh電化學(xué)儲(chǔ)能電站設(shè)計(jì)方案
- 余土外運(yùn)施工方案
評(píng)論
0/150
提交評(píng)論