




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(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é)議類庫(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í)性較好,滿足正常交流需要。(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分)1系統(tǒng)原理分析1.1系統(tǒng)原理概述視頻聊天系統(tǒng)應(yīng)該具備提供便捷、靈活、全面的音頻、視頻信息的傳遞和服務(wù)的功能,并且實(shí)時(shí)傳輸給聊天軟件在線的人。本次方案采用Microsoft Visual C+ 6.0編程開(kāi)發(fā)視頻聊天系統(tǒng)的一套比較常用的解決方案。語(yǔ)音視頻聊天采
3、用UDP模式,在客戶端之間點(diǎn)對(duì)點(diǎn)的進(jìn)行,因?yàn)閁DP傳輸速度快,TCP是面向連接的,建立連接時(shí)雙方需經(jīng)過(guò)三次握手,數(shù)據(jù)傳輸可靠,F(xiàn)TP、TELNET等就是基于TCP的,UDP是面向非連接的,發(fā)出信息不需對(duì)方確認(rèn),但這樣速度比TCP快,但有可能丟失數(shù)據(jù),象SMTP、TFTP等就是基于UDP的。在該方案中,通過(guò)函數(shù)庫(kù)VFW(Video for Windows)來(lái)實(shí)現(xiàn)視頻捕獲、影像壓縮以及影像播放。微軟公司提供的專門用于視頻捕獲開(kāi)發(fā)的工具包VFW,為在Windows操作系統(tǒng)中實(shí)現(xiàn)視頻捕獲提供了標(biāo)準(zhǔn)的接口,從而大大降低了程序的開(kāi)發(fā)難度。在視頻傳輸方面,則通過(guò)組建視頻幀,將位圖形式的視頻幀壓縮成幀格式的M
4、PEG4流,傳輸?shù)娇蛻舳撕?,解壓并顯示影像。同時(shí)采用線程來(lái)實(shí)現(xiàn)語(yǔ)音錄制和語(yǔ)音回放,最終實(shí)現(xiàn)了通過(guò)服務(wù)器中轉(zhuǎn)的文字聊天、點(diǎn)對(duì)點(diǎn)的語(yǔ)音視頻聊天。1.2關(guān)鍵技術(shù)分析可視對(duì)講的關(guān)鍵技術(shù)之一是音視頻同步問(wèn)題。解決同步問(wèn)題的方法有很多種,其中時(shí)間戳是最成熟最完美也是最復(fù)雜的解決辦法,可以解決任何多媒體領(lǐng)域的音視頻同步問(wèn)題。其原理是選擇一個(gè)參考時(shí)間,在生成數(shù)據(jù)流時(shí)依據(jù)參考時(shí)間上的時(shí)間給每個(gè)數(shù)據(jù)塊都打上時(shí)間戳;在播放時(shí),讀取數(shù)據(jù)塊上的時(shí)間戳,同時(shí)參考當(dāng)前時(shí)鐘上的時(shí)間來(lái)安排播放,讓快于這個(gè)參考時(shí)間的包等待,丟棄慢于這個(gè)參考時(shí)間的包。在基于時(shí)間戳的同步機(jī)制中,僅僅對(duì)不同步的數(shù)據(jù)進(jìn)行處理是不完備的,還需要反饋機(jī)制,
5、如基于Windows平臺(tái)的DirectShow就提供這樣一個(gè)反饋機(jī)制,它的質(zhì)量控制(QualityControl)可以將播放的狀態(tài)反饋給源,讓源端加快或者放慢數(shù)據(jù)流的速度。多媒體文件的采集,播放及對(duì)同步的要求都非常嚴(yán)格,如果從多媒體文件中分離出音視頻數(shù)據(jù)的數(shù)據(jù)不同步,音視頻的時(shí)間差則會(huì)越來(lái)越大,這是無(wú)法忍受的,所以在多媒體文件中,不但要求有同步機(jī)制,還要求有反饋機(jī)制。可視對(duì)講的關(guān)鍵技術(shù)之二是數(shù)據(jù)壓縮技術(shù)。多媒體信息數(shù)字化后的數(shù)據(jù)量非常大,尤其是視頻信號(hào),數(shù)據(jù)量更大,需要占用更大的信道帶寬,成本十分昂貴。為了節(jié)省存儲(chǔ)空間充分利用有限的信道容量傳輸更多視頻信息,必須對(duì)視頻信息進(jìn)行壓縮。目前,在視頻
6、圖像信息的壓縮方面已經(jīng)取得了很大的進(jìn)展。有關(guān)圖像壓縮編碼的國(guó)際標(biāo)準(zhǔn)主要有JPEG、H.261、H.263、MPEG-1、MPEG-2、MPEG-4等。有關(guān)音頻信號(hào)的壓縮編碼技術(shù)基本上與圖像壓縮技術(shù)相同,不同之處在于圖像信號(hào)是二維信號(hào),而音頻信號(hào)是一維信號(hào),相比較而言音頻信號(hào)數(shù)據(jù)壓縮難度較低。可視對(duì)講的關(guān)鍵技術(shù)之三是視頻采集。對(duì)于視頻的采集,主要采用微軟公司的關(guān)于數(shù)字視頻的一個(gè)軟件包VFW(Video for Windows)。VFW是Microsoft 1992年推出的關(guān)于數(shù)字視頻的一個(gè)軟件包,它能使應(yīng)用程序通過(guò)數(shù)字化設(shè)備并播放從傳統(tǒng)的模擬視頻源得到數(shù)字化的視頻剪輯。為了解決數(shù)字視頻數(shù)據(jù)量大的
7、問(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窗口類的高級(jí)編程工具,使程序員能通過(guò)發(fā)送消息或設(shè)置屬性來(lái)捕獲、播放和編輯視頻剪輯。用戶不必專門安裝VFW,在安裝Windows時(shí),安裝程序會(huì)自動(dòng)地安裝配置視頻所需的組件,如設(shè)備驅(qū)動(dòng)程序、視頻壓縮程序等。2系統(tǒng)總體方案設(shè)計(jì)2.1系統(tǒng)模塊分析2.1.1視頻捕獲VFW軟件包主要由以下六個(gè)模塊組成:(1)AVICAP.DLL:包含執(zhí)行視頻捕獲的函數(shù),它給AVI文件、I/O和
8、視頻、音頻設(shè)備驅(qū)動(dòng)程序提供一個(gè)高級(jí)接口;(2)MSVIDEO.DLL:包含一套特殊的DrawDib函數(shù),用來(lái)處理屏幕上的視頻操作;(3)MCIAVI.DRV:包括對(duì)VFW的MCI命令解釋器的驅(qū)動(dòng)程序;(4)AVIFILE.DLL:包含由標(biāo)準(zhǔn)多媒體I/O(mmio)函數(shù)提供的更高的命令,用來(lái)訪問(wèn)AVI文件;(5)壓縮管理器(ICM):用于管理的視頻壓縮/解壓縮的編譯碼器(Codec);(6)音頻壓縮管理器(ACM):提供與ICM相似的服務(wù),適用于波形音頻。AVICap支持實(shí)時(shí)的視頻流捕獲和單幀捕獲,并提供對(duì)視頻源的控制。雖然MCI也提供數(shù)字視頻服務(wù),比如,它為顯示AVI文件的視頻提供了AVIVi
9、deo命令集,為視頻疊加提供了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ù)字視頻捕獲到文件。在視頻捕獲之前需要?jiǎng)?chuàng)建一個(gè)捕獲窗,所有的捕獲操作及其設(shè)置都以它為基礎(chǔ)。用AVICap窗口類創(chuàng)建的窗口(通過(guò)capCreateCaptureWindow函數(shù)創(chuàng)建)被稱為“捕獲窗”,其窗口風(fēng)格一般為WS_CHILD和WS_VISIBLE。實(shí)際上
10、,捕獲窗類似于標(biāo)準(zhǔn)控制(如按鈕、列表框等)。捕獲窗具有下列功能:(1)將視頻流和音頻流捕獲到一個(gè)AVI文件中;(2)動(dòng)態(tài)地同視頻和音頻輸入器件連接或斷開(kāi);(3)以O(shè)verlay或Preview模式對(duì)輸入的視頻流進(jìn)行實(shí)時(shí)顯示;(4)在捕獲時(shí)可指定所用的文件名并能將捕獲文件的內(nèi)容拷貝到另一個(gè)文件;(5)設(shè)置捕獲速率;(6)顯示控制視頻源、視頻格式、視頻壓縮的對(duì)話框;(7)創(chuàng)建、保存或載入調(diào)色板;(8)將圖像和相關(guān)的調(diào)色板拷貝到剪貼板;(9)將捕獲的一個(gè)單幀圖像保存為DIB格式的文件。視頻捕獲編程涉及視頻捕獲的結(jié)構(gòu)、宏、消息和函數(shù)。發(fā)送AVICap窗口消息所能完成的功能都能調(diào)用相應(yīng)的宏來(lái)完成。如,S
11、endMessage與capDriverConnect的作用相同,都是將創(chuàng)建的捕獲窗同視頻輸入器件連接起來(lái)。靈活編寫(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ā)生下列情況時(shí),它能通知應(yīng)用程序,作出相應(yīng)的反應(yīng),捕獲窗狀態(tài)改變,出錯(cuò);視頻幀和音頻緩存可以使用;在捕獲過(guò)程中,其
12、它應(yīng)用程序處于讓步(Yield)地位。2.1.2視頻壓縮解壓縮視頻壓縮(視頻編碼)是把數(shù)字視頻流用更少的數(shù)據(jù)位進(jìn)行存放的方法。未經(jīng)壓縮的視頻數(shù)據(jù)量非常大,所以壓縮對(duì)于數(shù)字視頻的存儲(chǔ)和傳輸來(lái)說(shuō)都是必須的。圖像壓縮包括一對(duì)互補(bǔ)系統(tǒng),一個(gè)編碼器(encoder)和一個(gè)解碼器(decoder)。編碼器利用圖像數(shù)據(jù)之間的相關(guān)性。在保證圖像質(zhì)暈的情況下使用較少的數(shù)據(jù)以傳播或存儲(chǔ)該圖像;而解碼器則把壓縮后的圖像還原出原始的視頻數(shù)據(jù)。視頻壓縮解壓縮采用MPEG-4標(biāo)準(zhǔn)。MPEG-4是為在國(guó)際互聯(lián)網(wǎng)絡(luò)上或移動(dòng)通信設(shè)備(例如移動(dòng)電話)上實(shí)時(shí)傳輸音/視頻訊號(hào)而制定的最新MPEG標(biāo)準(zhǔn),MPEG4采用Object Ba
13、sed方式解壓縮,壓縮比指標(biāo)遠(yuǎn)遠(yuǎn)優(yōu)于以上幾種,壓縮倍數(shù)為450倍(靜態(tài)圖像可達(dá)800倍),分辨率輸入可從320 ×240到1280 ×1024,這是同質(zhì)量的MPEG1和MJEPG的十倍多。MPEG-4使用圖層(layer)方式,能夠智能化選擇影像的不同之處,是可根據(jù)圖像內(nèi)容,將其中的對(duì)象(人物、物體、背景)分離出來(lái)分別進(jìn)行壓縮,使圖文件容量大幅縮減,而加速音/視頻的傳輸,這不僅僅大大提高了壓縮比,也使圖像探測(cè)的功能和準(zhǔn)確性更充分的體現(xiàn)出來(lái)。在網(wǎng)絡(luò)傳輸中可以設(shè)定MPEG-4的碼流速率,清晰度也可在一定的范圍內(nèi)作相應(yīng)的變化,這樣便于用戶根據(jù)自己對(duì)錄像時(shí)間、傳輸路數(shù)和清晰度的不同
14、要求進(jìn)行不同的設(shè)置,大大提高了系統(tǒng)使用時(shí)的適應(yīng)性和靈活性。也可采用動(dòng)態(tài)幀測(cè)技術(shù),動(dòng)態(tài)時(shí)快錄,靜態(tài)時(shí)慢錄,從而減少平均數(shù)據(jù)量,節(jié)省存儲(chǔ)空間。而且當(dāng)在傳輸有誤碼或丟包現(xiàn)象時(shí),MPEG-4受到的影響很小,并且能迅速恢復(fù)。MPEG-4與MPEG-1、MPEG-2以及H.264相比,更注重多媒體系統(tǒng)的交互性和靈活性。最顯著的差別在于它采用基于對(duì)象的編碼理念;即在編碼時(shí)將一幅景物分成若干個(gè)在時(shí)間和空間上相互聯(lián)系的視頻音頻對(duì)象,分別編碼后經(jīng)過(guò)復(fù)用傳輸?shù)浇邮斩?,在接收端再?duì)不同對(duì)象分別解碼。最后合成所需的視頻和音頻。這樣便于對(duì)不同對(duì)象進(jìn)行不同的編碼和操作,也有利于不同數(shù)據(jù)類型間的融合。MPEG-4的應(yīng)用前景將
15、是非常廣闊的。它的出現(xiàn)將對(duì)以下各方面產(chǎn)生較大的推動(dòng)作用:數(shù)字電視、動(dòng)態(tài)圖像、萬(wàn)維網(wǎng)(WWW)、實(shí)時(shí)多媒體監(jiān)控、低比特率下的移動(dòng)多媒體通信、于內(nèi)容存儲(chǔ)和檢索多媒系統(tǒng)、Internet/Intranet上的視頻流與可視游戲、基于面部表情模擬的虛擬會(huì)議、DVD上的交互多媒體應(yīng)用、基于計(jì)算機(jī)網(wǎng)絡(luò)的可視化合作實(shí)驗(yàn)室場(chǎng)景應(yīng)用、演播電視等。2.1.3語(yǔ)音的錄制、回放我們主要利用線程來(lái)處理語(yǔ)音部分的錄制、回放。線程是一個(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ù)地址的形式
16、出現(xiàn),提供程序的啟動(dòng)點(diǎn),當(dāng)主線程終止時(shí),進(jìn)程也隨之終止。根據(jù)實(shí)際需要,應(yīng)用程序可以分解成許多獨(dú)立執(zhí)行的線程,每個(gè)線程并行的運(yùn)行在同一進(jìn)程中。一個(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ù)等待。Windows提供了兩種線程:用戶界面線程和工作線程(又稱為后臺(tái)線程)。這里主
17、要介紹用戶界面線程的運(yùn)用。用戶界面線程通常用來(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)程終止。(1)線程的啟動(dòng)創(chuàng)建一個(gè)用戶界面線程,首先要從類CwinThread產(chǎn)生一個(gè)派生類,同時(shí)必須使DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE來(lái)聲明和實(shí)現(xiàn)這個(gè)CwinThread派生類。第二步是根據(jù)需要重載該派生類的一些成員函數(shù)如:ExitInstance()、InitInstance()、OnIdle()、PreTranslateMessage(
18、)等函數(shù)。最后調(diào)用AfxBeginThread()函數(shù)的一個(gè)版本:CWinThread*AfxBeginThread(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)的堆棧大小,第四個(gè)參數(shù)為線程創(chuàng)建時(shí)的附加標(biāo)志,
19、缺省為正常狀態(tài),如為CREATE_SUSPENDED則線程啟動(dòng)后為掛起狀態(tài)。(2)線程的優(yōu)先級(jí)CwinThread類的成員函數(shù)用于線程優(yōu)先級(jí)的操作:int GetThreadPriority();BOOL SetThradPriority()(int nPriority)。(3)線程的掛起和恢復(fù)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)次的ResumeThread()來(lái)恢復(fù)線程
20、的運(yùn)行。(4)結(jié)束線程終止線程有三種途徑,線程可以在自身內(nèi)部調(diào)用AfxEndThread()來(lái)終止自身的運(yùn)行;可以在線程的外部調(diào)用BOOL TerminateThread(HANDLE hThread, DWORD dwExitCode)來(lái)強(qiáng)行終止一個(gè)線程的運(yùn)行,然后調(diào)用CloseHandle()函數(shù)釋放線程所占用的堆棧;第三種方法是改變?nèi)肿兞?,使線程的執(zhí)行函數(shù)返回,則該線程終止。2.1.4視頻傳輸語(yǔ)音視頻聊天采用用戶數(shù)據(jù)報(bào)協(xié)議(User Datagram Protocol)傳輸協(xié)議。UDP是無(wú)連接的網(wǎng)絡(luò)協(xié)議,無(wú)連接服務(wù)是郵政系統(tǒng)服務(wù)的抽象,每個(gè)分組都攜帶有完整的目的地址
21、,各分組在系統(tǒng)中獨(dú)立傳送。無(wú)連接服務(wù)不能保證分組的先后順序,不進(jìn)行分組出錯(cuò)的恢復(fù)與重傳,不保證傳輸?shù)目煽啃?。UDP協(xié)議提供無(wú)連接的數(shù)據(jù)報(bào)服務(wù)。而TCP/IP協(xié)議已經(jīng)很難適應(yīng)視音頻通信,特別是連續(xù)的媒體流(如視頻流)通信的要求。TCP協(xié)議是面向連接的協(xié)議,被用于各種網(wǎng)絡(luò)上提供有序可靠數(shù)據(jù)傳輸?shù)奶撾娐贩?wù)。它的重傳機(jī)制和擁塞控制機(jī)制(Congestion Control Mechanism)都是不適合用于實(shí)時(shí)視音頻傳輸?shù)?。因?yàn)镮P協(xié)議只提供無(wú)連接、無(wú)QOS保證的服務(wù),并且只是盡最大努力地傳送數(shù)據(jù)報(bào)。當(dāng)網(wǎng)絡(luò)帶寬不足而造成較長(zhǎng)的時(shí)延和較多的丟包時(shí),IP協(xié)議并不提供QOS反饋2。因此
22、,需要利用IP層之上的協(xié)議來(lái)滿足網(wǎng)絡(luò)視頻實(shí)時(shí)傳輸?shù)臅r(shí)延和丟包率的要求。UDP協(xié)議是面向非連接的網(wǎng)絡(luò)數(shù)據(jù)協(xié)議,在正式通信前不必與對(duì)方先建立連接,直接向接收方發(fā)送數(shù)據(jù),是一種不可靠的通信協(xié)議。正是由于UDP協(xié)議不關(guān)心網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)囊幌盗袪顟B(tài),使得UDP協(xié)議在數(shù)據(jù)傳輸過(guò)程中節(jié)省了大量的網(wǎng)絡(luò)狀態(tài)確認(rèn)和數(shù)據(jù)確認(rèn)的系統(tǒng)資源消耗,大大提高了UDP協(xié)議的傳輸速度,且UDP無(wú)需連接管理,可以支持海量并發(fā)連接。但是,視頻傳輸?shù)奶攸c(diǎn)要求傳輸協(xié)議能夠處理傳輸中的延遲和抖動(dòng)現(xiàn)象,能夠處理突發(fā)的視頻傳送,并且能夠根據(jù)接收端的接收質(zhì)量判斷網(wǎng)絡(luò)狀況,做出相應(yīng)的反饋3。UDP協(xié)議本身并不能很好地處理這些情況。由于UDP 協(xié)議不
23、能可靠傳輸視頻圖像,為此在應(yīng)用層添加如下機(jī)制實(shí)現(xiàn)視頻圖像的可靠傳輸。在發(fā)送端和接收端各開(kāi)一個(gè)視頻緩沖區(qū),暫存待發(fā)送和已接收的數(shù)據(jù)幀。通過(guò)流量控制,可以避免因網(wǎng)絡(luò)擁塞導(dǎo)致包丟失率增加。通過(guò)確認(rèn)技術(shù),可以實(shí)現(xiàn)圖像可靠傳輸。而超時(shí)處理可以避免發(fā)送端和接收端長(zhǎng)時(shí)間等待,根據(jù)網(wǎng)絡(luò)當(dāng)前狀況作出相應(yīng)的反饋。2.2軟硬件環(huán)境兩臺(tái)以上電腦,分別配有攝像頭、麥克風(fēng)、音箱或耳機(jī)等外部設(shè)備;Windows XP系統(tǒng),Microsoft Visual Studio 6.0編程開(kāi)發(fā)系統(tǒng)等。2.3技術(shù)要求語(yǔ)音視頻聊天作為一種廣泛的網(wǎng)絡(luò)應(yīng)用對(duì)其基礎(chǔ)的承載網(wǎng)絡(luò)環(huán)境有著較高的網(wǎng)絡(luò)要求。其中應(yīng)重點(diǎn)考慮的是網(wǎng)絡(luò)的帶寬情況、端到端的時(shí)
24、延、丟包率、時(shí)延抖動(dòng)等問(wèn)題。(1)網(wǎng)絡(luò)帶寬需求,視頻聊天對(duì)網(wǎng)絡(luò)的帶寬需求為“視頻帶寬+IP包頭開(kāi)銷”,計(jì)算方法為:網(wǎng)絡(luò)帶寬 = 視頻帶寬× 1.2。(2)端到端的時(shí)延,網(wǎng)絡(luò)傳輸不可避免的會(huì)發(fā)生傳輸時(shí)延,通常建議視頻聊天的通用時(shí)延小于150ms。(3)丟包率,網(wǎng)絡(luò)數(shù)據(jù)傳輸經(jīng)常會(huì)出現(xiàn)丟包現(xiàn)象,視頻傳輸過(guò)程中數(shù)據(jù)丟包嚴(yán)重的話會(huì)影響在線視頻聊天質(zhì)量。因此,在設(shè)計(jì)上應(yīng)將網(wǎng)絡(luò)上的丟包率控制在1%以內(nèi)。(4)時(shí)延抖動(dòng),由于音頻/視頻的傳輸為實(shí)時(shí)的交互,因此網(wǎng)絡(luò)的時(shí)延抖動(dòng)更為重要,一般,視頻聊天的時(shí)延抖動(dòng)控制在50ms內(nèi)。2.4系統(tǒng)結(jié)構(gòu)圖2.4.1硬件結(jié)構(gòu)系統(tǒng)該系統(tǒng)采用的是Client/Client
25、結(jié)構(gòu),客戶端是兩臺(tái)PC機(jī)和一個(gè)數(shù)字?jǐn)z像頭、耳機(jī)和麥克風(fēng)。進(jìn)行語(yǔ)音視頻聊天是客戶端與客戶端之間直接進(jìn)行的點(diǎn)對(duì)點(diǎn)的連接,它們之間的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)如圖1。在圖中,為了簡(jiǎn)便,沒(méi)有畫(huà)出麥克風(fēng)、音箱或耳機(jī)等外部設(shè)備。圖1 網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)圖2.4.2系統(tǒng)功能模塊圖語(yǔ)音視頻聊天是對(duì)整個(gè)在線客戶端兩兩之間進(jìn)行點(diǎn)對(duì)點(diǎn)的視頻聊天。語(yǔ)音視頻聊天包括了視頻捕獲、視頻壓縮、解壓縮、語(yǔ)音錄制、語(yǔ)音回放以及視頻傳輸?shù)?。整個(gè)系統(tǒng)的功能模塊圖如圖2所示。圖2 系統(tǒng)功能模塊圖系統(tǒng)各模塊流程圖語(yǔ)音視頻聊天流程圖如下圖3所示。在有兩個(gè)客戶在線的情況下,才能進(jìn)行語(yǔ)音視頻聊天。兩個(gè)用戶要進(jìn)行語(yǔ)音視頻聊天時(shí),一個(gè)用戶選中另一個(gè)用戶的用戶名,根據(jù)
26、該用戶名在后臺(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)行文字聊天。圖3 語(yǔ)音視頻聊天流程圖2.5數(shù)據(jù)流在發(fā)送端和接收端各開(kāi)一個(gè)視頻緩沖區(qū),暫存待發(fā)送和已接收的數(shù)據(jù)幀。由于無(wú)線傳輸帶寬和單片機(jī)軟硬件資源的限制,壓縮后的JPG 圖像(320 ×240)仍然必須在發(fā)送端分割成若干幀,到達(dá)接受端時(shí)重組。在LINUX 中,JPG 圖像就相當(dāng)于一個(gè)普通文件,可通過(guò)open () 函數(shù)打開(kāi)進(jìn)
27、行讀寫(xiě)。2.5.1數(shù)據(jù)幀結(jié)構(gòu)對(duì)每幀加上幀頭結(jié)構(gòu),幀頭結(jié)構(gòu)定義了序列號(hào),視頻壓縮格式,時(shí)戳。序列號(hào)是數(shù)據(jù)包發(fā)送的順序標(biāo)記,檢測(cè)傳輸中是否有數(shù)據(jù)丟失,并用在接收端來(lái)重新排序。視頻壓縮格式標(biāo)記用于接收端采用相應(yīng)的解碼流程。時(shí)間戳控制視頻回放的時(shí)間。幀結(jié)構(gòu)描述如圖4所示。圖4 數(shù)據(jù)幀結(jié)構(gòu)圖像在傳輸過(guò)程中還涉及到緩沖區(qū)、流量控制、確認(rèn)技術(shù)及超時(shí)處理等問(wèn)題。(1)緩沖區(qū)。由于發(fā)送端存在重發(fā)數(shù)據(jù)幀的可能,接收端有可能收到亂序的數(shù)據(jù)幀,故發(fā)送端和接收端確定一個(gè)視頻傳輸緩沖區(qū),大小為65 536 (可根據(jù)要傳送的圖像大小適當(dāng)調(diào)整) 字節(jié)。發(fā)送端首先把一幅jpg 圖像數(shù)據(jù)一次性寫(xiě)入緩沖區(qū),將其分解為若干數(shù)據(jù)幀,各
28、幀按照序號(hào)遞增的順序從1 依次編號(hào),使得每一幀的大小不超過(guò)2 048 字節(jié),稱為一個(gè)數(shù)據(jù)幀。接收端收到完整的一幅JPG 圖像數(shù)據(jù)后再一次性寫(xiě)入圖像文件中。(2)流量控制。UDP借鑒TCP 協(xié)議流量控制機(jī)制:慢啟動(dòng)和線性增長(zhǎng)成倍減少過(guò)程。在連接建立后的慢啟動(dòng)過(guò)程中,先將發(fā)送方窗口置為最小值,每當(dāng)成功傳送完窗口中的數(shù)據(jù)后,就成倍地增大窗口,直到某個(gè)閾值。這就保證了網(wǎng)絡(luò)流量不會(huì)突然增大,為其他連接留有余地。(3)確認(rèn)技術(shù)。在可靠數(shù)據(jù)傳遞協(xié)議中保證數(shù)據(jù)可靠傳遞的基本就是要使用確認(rèn)技術(shù)。為了更好地控制流量,達(dá)到最大限度地利用網(wǎng)絡(luò)資源的目的,可采用捎帶確認(rèn)、累計(jì)確認(rèn)和超時(shí)確認(rèn)以及擴(kuò)展確認(rèn)這幾種方式結(jié)合來(lái)實(shí)
29、現(xiàn)確認(rèn)。其中前3 種確認(rèn)方式和TCP 中的用法一致。在接收方收到失序數(shù)據(jù)包時(shí),為了最大限度地減少重傳,并不是簡(jiǎn)單將其丟棄,而是將其存儲(chǔ)在本地的失序緩沖隊(duì)列中,并設(shè)置失序包計(jì)數(shù)器。接收方在計(jì)數(shù)器超過(guò)閾值或者確認(rèn)定時(shí)器超時(shí)后向發(fā)送方發(fā)送擴(kuò)展確認(rèn)數(shù)據(jù)包。該數(shù)據(jù)包中攜帶本端已經(jīng)收到的最大按序包序號(hào)和收到的所有失序包的序號(hào)信息。發(fā)送端收到由接收端傳來(lái)的擴(kuò)展確認(rèn)數(shù)據(jù)包后,將根據(jù)最大確認(rèn)序號(hào)和對(duì)端收到的失序包的序號(hào)計(jì)算出應(yīng)該重傳的數(shù)據(jù)包序號(hào),并從重傳隊(duì)列中取出相應(yīng)的數(shù)據(jù)包進(jìn)行快速重傳。(4)超時(shí)處理。處理超時(shí)和重傳的方法之一就是發(fā)送一個(gè)請(qǐng)求后等待n 秒,如果沒(méi)有收到應(yīng)答,則重傳并再等待另外N 秒。這是一種線
30、性重傳的定時(shí)器,并且在重傳一定次數(shù)后就放棄重傳。這種辦法的問(wèn)題是,數(shù)據(jù)報(bào)在一個(gè)互聯(lián)網(wǎng)上往返的時(shí)間( RTT) 會(huì)從LAN 上的遠(yuǎn)遠(yuǎn)小到1 s 變成WAN 上的許多秒。影響往返時(shí)間(RTT) 的因素是距離、網(wǎng)絡(luò)速度和擁塞,當(dāng)網(wǎng)絡(luò)條件變化時(shí),客戶和服務(wù)器之間的RTT 會(huì)隨著時(shí)間很快地變化。因此,必須設(shè)計(jì)一個(gè)將實(shí)際測(cè)得的RTT 以及RTT 隨時(shí)間變化考慮在內(nèi)的超時(shí)和重傳算法。計(jì)算發(fā)送每個(gè)數(shù)據(jù)報(bào)的重傳超時(shí)( RTO) 的公式為:delta = RTT - srt tsrt t srtt + g ×deltart tvar rt tvar + h ×(| delta| - rt tv
31、ar)RTO = srtt + 4 ×rt tvar其中,RTT 為數(shù)據(jù)報(bào)的實(shí)際往返時(shí)間; srtt 為平滑了的RTT 估計(jì)因子;rttvar 為平滑了的平均偏差估計(jì)因子;delta 為測(cè)得的RTT 和當(dāng)前平滑了的RTT 估計(jì)因子(srtt) 之間的差;g 為施加在RTT 估計(jì)因子上的增益因子,值為1/ 8;h 為施加在平均偏差估計(jì)因子上的增益因子,值為1/ 4。當(dāng)重傳定時(shí)器超時(shí)的時(shí)候,對(duì)下一個(gè)RTO要用一個(gè)指數(shù)退回。例如,如果RTO 是2 s ,這段時(shí)間內(nèi)應(yīng)答沒(méi)有收到,則下一個(gè)RTO 是4 s ;如果仍沒(méi)有收到,下一個(gè)RT0 是8 s ,接著是16 s ,依此類推。2.5.2視頻圖
32、像數(shù)據(jù)傳輸過(guò)程以一幅圖像傳送為例。如一幅圖像共可拆分打包成n 個(gè)數(shù)據(jù)幀。某次發(fā)送編號(hào)為i ,j , k , m 共4 幀( i < j < k < m) ,接收方成功收到i , m 兩幀。接收方將已收到的所有幀序號(hào)打包成確認(rèn)幀發(fā)送出去,而不只是僅打包本次收到的i , m 兩幀。發(fā)送方收到確認(rèn)幀后,依據(jù)確認(rèn)幀里各幀序號(hào)將表明接收方是否成功收到數(shù)據(jù)幀的數(shù)組相應(yīng)位置1 。此時(shí)發(fā)送方依據(jù)流量控制原理選取序號(hào)大于m 的幀發(fā)送,而不是發(fā)送上次的序號(hào)為j, k 的幀。當(dāng)幀號(hào)等于n 時(shí)再?gòu)膸?hào)1 開(kāi)始依據(jù)序號(hào)遞增的方法選取還未收到確認(rèn)幀的各幀。實(shí)驗(yàn)表明,這樣大大減少了數(shù)據(jù)幀和確認(rèn)幀的重發(fā)。因
33、為發(fā)送方未收到確認(rèn)幀并不表明確認(rèn)幀由于受到線路噪聲干擾或路由器緩沖區(qū)已滿而被拋棄,也有可能還在尋找路由。TCP 的順序傳送以幀為單位,而本文方法卻是以一幅圖像為單位。發(fā)送流程如圖5所示,接收流程如圖6所示。圖5 圖像數(shù)據(jù)幀發(fā)送流程圖圖6 圖像數(shù)據(jù)幀接收流程圖音頻信號(hào)是一維信號(hào),音頻數(shù)據(jù)的收發(fā)更為簡(jiǎn)單,在這里就不作具體分析。3系統(tǒng)具體設(shè)計(jì)3.1呼叫處理3.1.1呼叫處理模塊在實(shí)現(xiàn)語(yǔ)音視頻聊天時(shí),采用的是基于UDP套接字的點(diǎn)對(duì)點(diǎn)模式,而UDP面向的是無(wú)連接的數(shù)據(jù)服務(wù),其套接字的使用如圖7所示。圖7 UDP套接字的使用3.1.2呼叫處理關(guān)鍵代碼客戶端請(qǐng)求連接線程(呼叫處理)關(guān)鍵代碼如下:DWORD
34、WINAPI ConnectThreadFunc(LPVOID pParam)CChatRoomDlg *pChatRoom = (CChatRoomDlg *)pParam;ASSERT(pChatRoom ! = NULL);pChatRoom ->m_ConnectSock = socket (AF_INET ,SOCK_STREAM , IPPROTO_TCP);if ( pChatRoom->m_ConnectSock = INVALID_SOCKET) AfxMessageBox(_T("新建Socket 失敗!");return FALSE;CSt
35、ring strServIp;pChatRoom->GetDlgItemText(IDC_IP_ADDR, strServIp);int iPort = pChatRoom ->GetDlgItemInt (IDC_CONNECT_PORT);if( iPort <= 0 | iPort > 65535 ) AfxMessageBox(_T("請(qǐng)輸入合適的端口:1 - 65535");goto _Error_End;char szIpAddr16 = 0;USES_CONVERSION;strcpy_s(szIpAddr, 16, T2A(strSe
36、rvIp);sockaddr_in server;server.sin_family = AF_INET;server.sin_port = htons(iPort);server.sin_addr.s_addr = inet_addr(szIpAddr);if(connect(pChatRoom->m_ConnectSock,(struct sockaddr*)&server, sizeof(struct sockaddr) = SOCKET_ERROR )AfxMessageBox(_T("連接失敗,請(qǐng)重試!");goto _Error_End;pChat
37、Room->ShowMsg(_T(" 系統(tǒng)信息:連接服務(wù)器成功!");while( TRUE ) if ( SOCKET_Select(pChatRoom->m_ConnectSock) ) TCHAR szBufMAX_BUF_SIZE = 0;int iRet = recv (pChatRoom->m_ConnectSock, (char*)szBuf, MAX_BUF_SIZE, 0);if ( iRet > 0 ) pChatRoom->ShowMsg(szBuf);elsepChatRoom->ShowMsg(_T("
38、聊天服務(wù)器已停止,請(qǐng)重新進(jìn)行連接!");break;Sleep(500);_Error_End:closesocket(pChatRoom->m_ConnectSock);return TRUE;3.2音視頻采集與播放利用VFW接口,視頻捕獲可以分為以下幾個(gè)步驟:(1)建立視頻采集窗口:該窗口用來(lái)接收視頻捕捉驅(qū)動(dòng)程序傳來(lái)的數(shù)據(jù)和消息。(2)連接視頻驅(qū)動(dòng)程序:將建立的視頻捕捉窗口與視頻設(shè)備驅(qū)動(dòng)程序相連。(3)視頻捕獲初始化。(4)視頻捕捉設(shè)置:VFW下視頻捕捉參數(shù)的設(shè)置可以通過(guò)調(diào)用函數(shù)或彈出對(duì)話框的形式來(lái)實(shí)現(xiàn)。一般視頻驅(qū)動(dòng)程序允許設(shè)置的參數(shù)包括視頻源選擇、視頻格式、視頻顯示格式等
39、。(5)設(shè)置回調(diào)函數(shù):通過(guò)回調(diào)函數(shù)來(lái)通知程序視頻事件的發(fā)生,比如捕捉一幀圖像成功的消息,捕捉出錯(cuò)的消息等。(6)結(jié)束捕捉:結(jié)束捕捉是應(yīng)該有一些清除工作。如釋放分配的內(nèi)存,斷開(kāi)捕捉窗口與視頻捕捉驅(qū)動(dòng)程序的連接,清除視頻捕捉窗口等。3.2.1捕獲窗口在捕獲前必須創(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)連接上后,就可以通過(guò)捕獲窗口向捕獲設(shè)備發(fā)送各種消息,可以使用函數(shù)
40、capGetDriverDescription來(lái)獲得已安裝的捕獲設(shè)備名稱及版本,將其列舉在實(shí)現(xiàn)程序過(guò)程中。再利用capDriverGetName函數(shù)來(lái)得到捕獲設(shè)備的名稱將獲得的版本發(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)該在獲取捕獲設(shè)備的視頻格式以后及時(shí)進(jìn)行刷新。
41、而捕獲窗口尺寸的改變并不影響實(shí)際的捕獲視頻流的尺寸。該尺寸由視頻捕獲設(shè)備的格式和視頻對(duì)話框決定。代碼如下:/捕獲窗口BOOL VideoCapture:Initialize() char devname128=0,devversion128=0;int index=0; BOOL ret = TRUE, ret1 = TRUE, ret2 = TRUE, ret3 = TRUE;TRACE("VideoCapture:Initializen"); /創(chuàng)建一個(gè)AVICap捕獲窗口m_capwnd = capCreateCaptureWindow("Capture&q
42、uot;,WS_POPUP,0,0,1,1,0,0);if(!m_capwnd)return FALSE;/connect callback functionsret = capSetUserData(m_capwnd,this);/Change destroy functions also. ret1 = capSetCallbackOnVideoStream(m_capwnd,OnCaptureVideo); /得到已安裝的捕獲設(shè)備的名稱及版本 ret2 = capGetDriverDescription(index,devname,100,devversion,100);/ Connec
43、t to webcam driver/使一個(gè)捕獲窗口與一個(gè)捕獲設(shè)備連接或關(guān)聯(lián)ret3 = capDriverConnect(m_capwnd,index);if(!(ret && ret1 && ret2 && ret3)/ Device may be open already or it may not have been/ closed properly last time.AfxMessageBox("Unable to open Video Capture Device");/log.WriteString("
44、;n Unable to connect driver to the window");m_capwnd=NULL;return FALSE;/ Set the capture parametersif(SetCapturePara()=FALSE)/ log.WriteString("n Setting capture parameters failed");capDriverDisconnect(m_capwnd); /使捕獲窗口與一個(gè)捕獲設(shè)備斷開(kāi)return FALSE;return TRUE;3.2.2設(shè)置CAPTUREPARAMS結(jié)構(gòu)VC+采用VFW技術(shù)
45、,客戶端通過(guò)capSetCallbackOnFrame()注冊(cè)回調(diào)函數(shù),當(dāng)采集卡采集到一幅圖像后,系統(tǒng)就會(huì)自動(dòng)調(diào)用回調(diào)函數(shù),在其中使用ICSeqCompressFrame()函數(shù)進(jìn)行壓縮。然后再通過(guò)Winsock將壓縮后的數(shù)據(jù)發(fā)送到另一客戶端。該客戶端接收完一幀以后,交給ICDecompress()解壓,最后用SetDIBitsToDevice()將圖像顯示出來(lái)。基本的捕獲設(shè)置包括設(shè)置捕獲速度(每秒捕獲多少幀)、是否同時(shí)捕獲聲頻、捕獲緩沖、允許最大丟失多少幀和是否使用DOS內(nèi)存,以及使用鍵盤(pán)的哪個(gè)鍵或鼠標(biāo)的哪個(gè)鍵來(lái)終止捕獲等內(nèi)容,這些設(shè)置使用CAPTUREPARAMS結(jié)構(gòu)描述,capCaptu
46、reGetSetup宏來(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è)置保存在CAPTUREPARAMS結(jié)構(gòu)的vKeyAbort成員中,鼠標(biāo)設(shè)置保存在fAbortLeftMouse和fAbortRightMouse成員中
47、,通過(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)代碼:BOOL VideoCapture:SetCapturePara()CAPTUREPARMS CapParms=0;capCaptureGetSetup(m_capwnd,&CapParms,siz
48、eof(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("n Failed to set the capture paramet
49、ers ");return FALSE;/ Set Video Format capGetVideoFormat(m_capwnd,&m_bmpinfo,sizeof(m_bmpinfo);m_bmpinfo.bmiHeader.biWidth=IMAGE_WIDTH;m_bmpinfo.bmiHeader.biHeight=IMAGE_HEIGHT;BOOL ret=capSetVideoFormat(m_capwnd,&m_bmpinfo,sizeof(m_bmpinfo);/log.WriteString("n Video parameters set
50、 properly");return ret;/終止一個(gè)捕獲任務(wù)BOOL VideoCapture:StopCapture()capCaptureStop(m_capwnd);capCaptureAbort(m_capwnd);Sleep(500);return TRUE;3.3音視頻處理(編解碼)音視頻編碼處理就是對(duì)音視頻進(jìn)行壓縮。MPEG-4編碼算法的完整源代碼如下:class CVideoEncoderX264 :public: CVideoEncoderX264(void); CVideoEncoderX264(void); virtual bo
51、ol Connect(CVideoEnDecodeNotify* pNotify, const CVideoEnDecodeItem& Item); virtual void Release(void); virtual void Encode(BYTE* pInData, int nLen, BYTE* pOutBuf, int& nOutLen, int& nKeyFrame);private: x264_picture_t m_Pic; x264_t *h; x264_param_t param; void Flush(void);文
52、件:VideoEncoderX264.cppbool CVideoEncoderX264:Connect(CVideoEnDecodeNotify* pNotify, const CVideoEnDecodeItem& Item) CBase:Connect(pNotify, Item); ParseSize(Item.m_stSize); x264_param_default( ¶m ); param.i_threads = 1; param.i_frame_total = 0; param.i_width&
53、#160; = m_nWidth; param.i_height = m_nHeight; param.i_keyint_min = Item.m_nKeyInterval; param.i_keyint_max = Item.m_nKeyInterval * 10; param.i_fps_num = Item.m_nFps;*/ param.i_log_level = X264_LOG_NONE;if( ( h = x264_encoder_open( ¶m ) ) = NULL ) return false;
54、/* Create a new pic */x264_picture_alloc( &m_Pic, X264_CSP_I420, param.i_width, param.i_height ); return true;void CVideoEncoderX264:Release(void) Flush(); x264_picture_clean( &m_Pic ); x264_encoder_close( h ); CBase:Release();void CVideoEncoderX264:Encode(BYTE* pInD
55、ata, int nLen, BYTE* pOutBuf, int& nOutLen, int& nKeyFrame) if(nLen != param.i_width * param.i_height * 3) return; param.i_frame_total +;memcpy(m_Pic.img.plane0, pInData, param.i_width * param.i_height);memcpy(m_Pic.img.plane1, pInData + param.i_width * param.i_height, param.i
56、_width * param.i_height / 4);memcpy(m_Pic.img.plane2, pInData + param.i_width * param.i_height * 5 / 4, param.i_width * param.i_height / 4); m_Pic.i_pts = (int64_t)param.i_frame_total * param.i_fps_den;static x264_picture_t pic_out;x264_nal_t *nal = NULL;int i_nal, i;if( &m_Pic )m_Pic.i_typ
57、e = X264_TYPE_AUTO;m_Pic.i_qpplus1 = 0; /TraceTime("x264_encoder_encode begin");if( x264_encoder_encode( h, &nal, &i_nal, &m_Pic, &pic_out ) < 0 ) return;/TraceTime("x264_encoder_encode end");int nOutCanUse = nOutLen;nOutLen = 0;for( i =
58、0; i < i_nal; i+ )int i_size = 0;if( ( i_size = x264_nal_encode( pOutBuf + nOutLen, &nOutCanUse, 1, &nali ) ) > 0 )nOutLen += i_size;nOutCanUse -= i_size;nKeyFrame = pic_out.i_type=X264_TYPE_IDR;/ | (pic_out.i_type=X264_TYPE_I && coCfg->x264_max_ref_frames=1)void CVideoEncoderX264:Flush(void)x264_picture_t pic_out;x264_nal_t *nal;int i_nal, i;int i_file = 0;if( x264_encoder_encode( h, &nal, &i_nal, NULL, &pic_out ) < 0 )解碼代碼不做詳細(xì)分析。3.4.語(yǔ)音處理3.4.1語(yǔ)
溫馨提示
- 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ù)網(wǎng)僅提供信息存儲(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ù)學(xué)院《韓語(yǔ)視聽(tīng)說(shuō)》2023-2024學(xué)年第二學(xué)期期末試卷
- 項(xiàng)目跟蹤督辦方案(3篇)
- 超市魚(yú)池維護(hù)方案(3篇)
- 商鋪銷售推廣方案(3篇)
- 廠房升級(jí)方案(3篇)
- 投標(biāo)服務(wù)方案-投標(biāo)(3篇)
- 學(xué)校宿舍保潔方案(3篇)
- 樓面房屋修繕?lè)桨?3篇)
- 衛(wèi)浴采購(gòu)方案(3篇)
- 園區(qū)電費(fèi)收繳方案(3篇)
- JG/T 283-2010膨脹玻化微珠輕質(zhì)砂漿
- 電力法規(guī)考試試題及答案
- 2025昆明醫(yī)科大學(xué)海源學(xué)院輔導(dǎo)員考試試題及答案
- 路沿石購(gòu)銷合同模板
- 誰(shuí)是消費(fèi)“領(lǐng)頭羊”:人口周期改變消費(fèi)模式221mb
- 2024福建省閩投深海養(yǎng)殖裝備租賃有限責(zé)任公司招聘7人筆試參考題庫(kù)附帶答案詳解
- 2025年江西省贛州市八年級(jí)中考模擬預(yù)測(cè)生物試題(含答案)
- 2025屆上海市閔行區(qū)21學(xué)校七年級(jí)生物第二學(xué)期期末調(diào)研試題含解析
- 車牌過(guò)戶協(xié)議書(shū)范本
- 火災(zāi)自動(dòng)報(bào)警系統(tǒng)故障應(yīng)急預(yù)案
- 《拓印新貌》教學(xué)課件-2024-2025學(xué)年滬書(shū)畫(huà)版(五四學(xué)制)(2024)初中美術(shù)六年級(jí)下冊(cè)
評(píng)論
0/150
提交評(píng)論