張玨
(榆林學(xué)院 信息學(xué)院,陜西 榆林 719200)
隨著網(wǎng)絡(luò)帶寬的不斷增長(zhǎng),人們的通訊已經(jīng)開始從以文本為主導(dǎo)輔助以少量的音頻和視頻信息的模式逐漸轉(zhuǎn)向以給人們更為豐富信息的音頻為主導(dǎo)并輔助以少量的文本和視頻信息的模式。在一些特定的場(chǎng)合單純的視頻通訊的需求亦隨著網(wǎng)絡(luò)帶寬的增長(zhǎng)逐漸浮出水面。MSN和QQ無法滿足以上需求,市場(chǎng)上少量相關(guān)產(chǎn)品亦無法滿足網(wǎng)絡(luò)帶寬增長(zhǎng)所引發(fā)的層出不窮的需求。即時(shí)通信支撐系統(tǒng)是在以上需求驅(qū)動(dòng)之下構(gòu)思的一個(gè)包裝了多種基本應(yīng)用的網(wǎng)絡(luò)應(yīng)用軟件支撐平臺(tái),其中包括視頻采集、視頻壓縮、視頻傳輸、音頻采集、音頻壓縮、音頻傳輸、文本傳輸?shù)?。這些基本應(yīng)用具有簡(jiǎn)單的上層接口,使得基于此系統(tǒng)的網(wǎng)絡(luò)應(yīng)用軟件開發(fā)人員只需了解它們的借口而不必理解其內(nèi)部邏輯即可開發(fā)出各種功能強(qiáng)大的網(wǎng)絡(luò)應(yīng)用軟件,可以極大的加速網(wǎng)絡(luò)應(yīng)用軟件的開發(fā)速度。
即時(shí)通信系統(tǒng)主要實(shí)現(xiàn)以下功能:
1)在局域網(wǎng)中兩臺(tái)或者兩臺(tái)以上的主機(jī)可以輸入對(duì)方的IP地址請(qǐng)求連接。
2)系統(tǒng)啟動(dòng)視頻,音頻或文本傳輸設(shè)備。
3)遠(yuǎn)端可以隨時(shí)終止或者開啟本地視頻,音頻等其它設(shè)備。
文本交流功能:文本交流是實(shí)現(xiàn)多種媒體交互的基本功能部分。本系統(tǒng)實(shí)現(xiàn)了局域網(wǎng)P2P文本聊天功能,主要包括:在信息欄輸入交談的內(nèi)容,按發(fā)送鍵發(fā)送、同時(shí)能在聊天記錄上接收到對(duì)方的聊天內(nèi)容。
語音交流功能:語音交流是多媒體會(huì)議最重要的部分,往往是最直接和最多表達(dá)信息量的一種方式。當(dāng)用戶雙方接受請(qǐng)求,建立連接后,就可進(jìn)入語音交流。通過菜單欄上的“音頻”菜單可以控制音量,屏蔽發(fā)送方或接收方中任意一方的消息。
視頻交流功能:視頻交流能使多媒體交互更具人性化,通過圖像的顯示,使人們之間的交流更加親切直觀。當(dāng)下載本軟件連接成功后,就可以看到對(duì)方的視頻圖像。通過菜單欄上的“顯示控制”菜單可以屏蔽發(fā)送方或接收方中任意一方的視頻窗口。
圖1 音頻流程Fig.1 Audio process diagram
圖2 視頻流程Fig.2 Video process diagram
啟動(dòng)服務(wù)器,和連接用戶用例,活動(dòng)圖如圖3所示。
啟動(dòng)服務(wù)器,用戶點(diǎn)擊“文件”下拉菜單中“連接”選項(xiàng),如果硬件條件不具備,系統(tǒng)拒絕,那么重新啟動(dòng)系統(tǒng),修正硬件,如果硬件滿足運(yùn)行條件,系統(tǒng)接受請(qǐng)求,出現(xiàn)IP地址對(duì)話框,用戶在其中輸入正確IP地址,對(duì)方“拒絕”,重新選擇連接對(duì)象,重新輸入IP地址,對(duì)方“接受”,那么雙方鏈接成功,雙方進(jìn)入交流主界面,其他功能正常啟動(dòng)。
主要論述了即時(shí)通信系統(tǒng)錄放音功能的設(shè)計(jì)與實(shí)現(xiàn)、采集功能的設(shè)計(jì)實(shí)現(xiàn),以及發(fā)送接收系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)。本系統(tǒng)是基于局域網(wǎng)的P2P網(wǎng)絡(luò)結(jié)構(gòu)的即時(shí)通信系統(tǒng),所以涉及到的通信雙方,不管是請(qǐng)求方或是被請(qǐng)求方,都是對(duì)等的,權(quán)限都是相同的,所有系統(tǒng)的使用者,都是普通用戶。所以系統(tǒng)只有兩個(gè)角色,即兩個(gè)類,一個(gè)普通用戶類,一個(gè)系統(tǒng)類。
圖3 系統(tǒng)活動(dòng)圖Fig.3 System active diagram
一個(gè)類是系統(tǒng)資源,用戶類主要屬性:角色碼、用戶名、所在的IP地址。用戶操作主要有:連接服務(wù)器、視頻交流、文本交流、音頻交流。另一個(gè)類是系統(tǒng)資源類,為系統(tǒng)提供功能,主要有3個(gè)子類:音頻、視頻、文本類。音頻類主要操作為音量控制、發(fā)送、接收、播放、錄音。視頻類的主要操作有、本地視頻窗口、遠(yuǎn)程視頻窗口。文本類,主要操作是文本交流。
音頻采集:打開錄音設(shè)備,采集發(fā)言者語音信息,是windows通過高級(jí)音頻函數(shù)、媒體控制接口MCI設(shè)備驅(qū)動(dòng)程序,低級(jí)音頻函數(shù)MIDI Mapper、低級(jí)音頻設(shè)備驅(qū)動(dòng),以及DirectSound提供了音頻服務(wù),可以從聲卡獲取音頻流。在本系統(tǒng)中,采用低層音頻服務(wù)來實(shí)現(xiàn)。
低層音頻服務(wù)主要包括查詢音頻設(shè)備、打開/關(guān)閉音頻設(shè)備驅(qū)動(dòng)程序、音頻格式的設(shè)置、分配/準(zhǔn)備音頻緩沖區(qū)以及管理音頻緩沖區(qū)等。
錄制波形音頻的流程圖如下:
1)調(diào)用函數(shù)UINT WaveInGetNumDevs:查詢系統(tǒng)是否具備錄制音頻的設(shè)備,函數(shù)的返回值為可進(jìn)行音頻錄制的設(shè)備數(shù)量。
圖4 系統(tǒng)類圖Fig.4 System class diagram
由于多媒體計(jì)算機(jī)之間的音頻設(shè)備的性能差別很大,應(yīng)用程序根據(jù)不同系統(tǒng)的音頻硬件采用不同的方法。
2)調(diào)用函數(shù)WaveInGetDevCaps():檢查音頻輸入設(shè)備的性能,以確定設(shè)備錄制所支持的標(biāo)準(zhǔn)音頻的格式。
如果需要錄制的是非標(biāo)準(zhǔn)格式,則需要通過調(diào)用waveInOpen函數(shù),并設(shè)置打開設(shè)備的標(biāo)志為WAVE_FORMAT_QUERY,查詢?cè)O(shè)備是否支持非標(biāo)準(zhǔn)波形格式。非標(biāo)準(zhǔn)波形格式WAVEFORMATEX說明。
3)waveInOpen函數(shù):打開波形輸入設(shè)備。設(shè)備打開成功后,phwi將指向音頻輸入設(shè)備句柄HWAVRIN,該句柄是后續(xù)對(duì)設(shè)備進(jìn)行操作的對(duì)象。
4)waveInPrepareHeader:打開音頻輸入設(shè)備,獲取句柄后,調(diào)用函數(shù)生成WAVE音頻信息頭結(jié)構(gòu)。
5)waveInAddBuffer函數(shù):將波形輸入設(shè)備獲得數(shù)據(jù)寫入WAVEHDR。
6)waveStart函數(shù):開始錄音。
7)錄制完成后調(diào)用waceInUnPrepareHeader:清除波形音頻數(shù)據(jù)結(jié)構(gòu)WAVEHDR,釋放分配的資源。
8)waveInClose:關(guān)閉波形音頻輸入設(shè)備。
需要注意的是,如果終止錄制,丟棄音頻數(shù)據(jù)塊,不能用waveInStart重新錄制。要重新錄制,必須重新準(zhǔn)備數(shù)據(jù)塊,調(diào)用waveInReset來實(shí)現(xiàn),再用waveInStart重新錄制。
本系統(tǒng)是在局域網(wǎng)的中進(jìn)行傳輸,而且由時(shí)間等各方面的限制沒有實(shí)現(xiàn)語音壓縮,只是直接將采集到的語音放到緩沖區(qū)里,然后發(fā)送,最后接收方接收,但是因?yàn)闆]有對(duì)語音數(shù)據(jù)進(jìn)行壓縮和解壓縮,數(shù)據(jù)質(zhì)量良好。
系統(tǒng)利用socket中的sendto語句發(fā)送數(shù)據(jù)給接收發(fā),接受方利用socket中的receive語句接收數(shù)據(jù),發(fā)送時(shí)是發(fā)送緩沖區(qū)中的數(shù)據(jù),所以接收時(shí)需要?jiǎng)?chuàng)建接收緩沖區(qū)隊(duì)列,進(jìn)行接收,然后在打開放音設(shè)備,使聲音傳到人的耳朵,由于UDP協(xié)議是無連接的,每個(gè)分組都攜帶完整的目的地址,各分組在系統(tǒng)中獨(dú)立發(fā)送。它不能保證分組的先后順序,不進(jìn)行分組出錯(cuò)的恢復(fù)和重傳,因此不能保證傳輸?shù)目煽啃?,但是,它提供高速率的?shù)據(jù)報(bào)服務(wù)。由于語音聊天注重?cái)?shù)據(jù)的實(shí)時(shí)性,所以采用UDP協(xié)議,可靠性由網(wǎng)絡(luò)特征來保證。實(shí)際的設(shè)計(jì)中,socket接口可以通過一個(gè)socket連接指定協(xié)議的類型,聲音數(shù)據(jù)的全雙工通訊由聲音數(shù)據(jù)的發(fā)送和接收模塊實(shí)現(xiàn)。系統(tǒng)是端對(duì)端的語音聊天功能,兩個(gè)短點(diǎn)之間是對(duì)等關(guān)系,對(duì)于任何一端來說,既是有客戶機(jī)的功能,同時(shí)也具備服務(wù)器的特性。語音聊天進(jìn)行的是全雙工的數(shù)據(jù)通訊,對(duì)于實(shí)際通話的主叫端和客戶端都要發(fā)送數(shù)據(jù)和接收數(shù)據(jù)。從建立socket到數(shù)據(jù)的發(fā)送直至數(shù)據(jù)的接收主要有以下幾個(gè)步驟:
1)建立發(fā)送數(shù)據(jù)的soul和用于接收數(shù)據(jù)的ssine。
2)在開始時(shí)主叫端和被叫端都通過調(diào)用BIND()函數(shù)讓soul和ssin和本地地址(包括主機(jī)地址和協(xié)議端口)聯(lián)系起來,對(duì)協(xié)議端口進(jìn)行偵聽,以便接收對(duì)它服務(wù)請(qǐng)求產(chǎn)生的數(shù)據(jù)報(bào)應(yīng)答。
3)為了讓系統(tǒng)記住發(fā)送的目的地址(即被叫端地址),在開始時(shí),主叫端先調(diào)用CON-NECT()函數(shù)向被叫端發(fā)出請(qǐng)求,然后進(jìn)入發(fā)送和接收聲音數(shù)據(jù)的消息循環(huán)。
4)被叫端通過RECVFROMO函數(shù)向主叫端發(fā)出連接請(qǐng)求,并進(jìn)入發(fā)送和接收聲音數(shù)據(jù)的消息循環(huán)。
5)在兩端建立了通訊鏈路后,就可以進(jìn)行數(shù)據(jù)的雙向多次傳輸。聲音數(shù)據(jù)的發(fā)送主要有一個(gè)監(jiān)聽線程和sout完成,一旦監(jiān)測(cè)到有聲音信號(hào)的出現(xiàn),就調(diào)用數(shù)據(jù)壓縮模塊對(duì)要發(fā)送的聲音數(shù)據(jù)進(jìn)行壓縮處理,然后調(diào)用SEND()函數(shù)把數(shù)據(jù)發(fā)送到另一端。數(shù)據(jù)的接收方同樣由一個(gè)監(jiān)聽線程和ssin完成,一旦監(jiān)測(cè)到有聲音數(shù)據(jù)到達(dá),就調(diào)用RECVO函數(shù)進(jìn)行接收,并把接收到的數(shù)據(jù)放入排斥區(qū),交與聲音播放模塊處理。這樣完成了一次數(shù)據(jù)的傳輸和接收。
6)不斷重復(fù)5)的過程,直至通話結(jié)束。
主要是循環(huán)地操作nReceive和nSend指針。首先發(fā)送(接收)聲音塊的長(zhǎng)度,然后發(fā)送(接收)聲音內(nèi)容。注意:拿CSocket::Send(buffer,count)為例,其返回值(發(fā)送出去的字結(jié)數(shù))只是1到count之間的某值,所以要添加檢測(cè)機(jī)制,否則將出現(xiàn)錯(cuò)誤,這也是socket編程必須注意的。文中是用一個(gè)循環(huán),直到發(fā)送出去的字節(jié)總數(shù)等于“塊”的長(zhǎng)度才發(fā)送第二個(gè)數(shù)據(jù)塊的信息。
視頻模塊作為視頻會(huì)議系統(tǒng)的一個(gè)可選的組件,強(qiáng)化多用戶之間的協(xié)同工作。用戶可以根據(jù)協(xié)同的需要,設(shè)備狀況或網(wǎng)絡(luò)通信的現(xiàn)狀,選擇是否進(jìn)行視頻交互或調(diào)整視頻交互的質(zhì)量。
在本系統(tǒng)中,視頻模塊主要以一定幀率捕獲視頻數(shù)據(jù),并壓縮發(fā)送視頻數(shù)據(jù)給其他用戶,同時(shí)接收其他客戶的視頻信號(hào),解壓縮回放視頻信號(hào)。本地視頻直接顯示并進(jìn)行監(jiān)控。它主要以下部分組成:
1)視頻捕獲:生成視頻捕獲窗口,捕獲視頻負(fù)責(zé)。
2)視頻發(fā)送緩沖區(qū)管理:捕獲視頻幀加入視頻發(fā)送緩沖池。
3)視頻壓縮:對(duì)視頻幀壓縮,以獲得低通信量。
4)發(fā)送視頻數(shù)據(jù):從視頻發(fā)送緩沖池取出視頻幀在網(wǎng)絡(luò)信道上傳播。
5)接收視頻數(shù)據(jù):從網(wǎng)絡(luò)信道接收壓縮的視頻幀。
6)視頻接收緩沖區(qū)管理:接收的視頻幀加入視頻接收緩沖池。
7)視頻解壓縮:從視頻幀接收緩沖池中取出視頻幀解壓縮。
8)視頻回放:將視頻幀在本地回放。
由于實(shí)時(shí)傳輸?shù)男枰?,模塊需要在時(shí)間上并行工作,因此軟件的視頻部分由多個(gè)線程組成。線程間用事件對(duì)象進(jìn)行同步,而共享數(shù)據(jù)區(qū)用臨界區(qū)對(duì)象和信號(hào)量對(duì)象進(jìn)行同步。
視頻數(shù)據(jù)的實(shí)時(shí)采集主要是通過調(diào)用AVICap32.dll(avicap32.dll是Windows API應(yīng)用程序接口相關(guān)模塊,用于對(duì)攝像頭和其它視頻硬件進(jìn)行AVI電影和視頻的截?。﹦?chuàng)建AVICap窗口類,由AVICap窗口類中的消息、宏函數(shù)、結(jié)構(gòu)以及回調(diào)函數(shù)來完成。AVICap在捕獲視頻方面具有明顯的優(yōu)勢(shì),它能直接訪問視頻緩沖區(qū),不需要生成中間文件,實(shí)時(shí)性很高,它也可將數(shù)字視頻保存到事先建好的文件中。實(shí)際應(yīng)用表明,通過這種方法,提高了視頻采集的效果和程序運(yùn)行的效率,同時(shí)也減少了對(duì)硬件的依賴性,提高了程序的兼容性和移植性。
VFW的視頻采集功能主要包括捕獲視頻流至AVI文件(capCaptureSequence)、捕獲視頻流至緩存(capCaptureSequence Nofile)、捕獲視頻流至 AVI文件(capCaptureSingleFrame)、本地預(yù)覽(capPreview/capOverlay)和捕獲單幀預(yù)覽(capGrabFrame/capGrabFrameNoStop)等。VFW還提供了回調(diào)函數(shù),允許應(yīng)用程序精確控制視頻流的捕獲、檢測(cè)錯(cuò)誤、監(jiān)控狀態(tài)變化 ,以及在捕獲兩幀數(shù)據(jù)的空隙和每捕獲新幀時(shí)對(duì)實(shí)時(shí)數(shù)據(jù)進(jìn)行處理。
對(duì)于本系統(tǒng),通過BoundsChecke軟件測(cè)試,可證明程序代碼在運(yùn)行是無異常,可正常執(zhí)行。在進(jìn)行測(cè)試時(shí),首先運(yùn)行在開始實(shí)施測(cè)試之前設(shè)計(jì)好測(cè)試用例,可以避免盲目測(cè)試并提高測(cè)試效率。
經(jīng)過多次測(cè)試表明,該即時(shí)通信系統(tǒng)的各個(gè)功能都基本達(dá)到了實(shí)用的要求?!拔募毕吕藛蜗碌摹巴顺觥边x項(xiàng)可以隨時(shí)退出系統(tǒng),“連接”選項(xiàng),可以隨時(shí)選擇連接對(duì)象,客戶端能夠及時(shí)發(fā)送服務(wù)請(qǐng)求或視頻、音頻與文件請(qǐng)求,以及接收各種請(qǐng)求結(jié)果。在各種負(fù)荷下能正常工作,客戶端可以及時(shí)響應(yīng)和處理客戶端的各種請(qǐng)求,沒有出現(xiàn)異常情況,具備一定的健壯性。局域網(wǎng)測(cè)試為用戶觀看到的視頻監(jiān)控畫面。通過系統(tǒng)測(cè)試,客戶端收到的視頻圖像播放幀率在24~25幀之間波動(dòng),比服務(wù)器端滯后大約1~1.5 s,傳輸圖像較清晰,沒有出現(xiàn)馬賽克情況。音頻通信效果清楚,沒有出現(xiàn)斷音或爆音的情況,延時(shí)大約120~150 ms,能夠保證實(shí)時(shí)音頻通信。
圖5 系統(tǒng)測(cè)試圖Fig.5 System test diagram
該測(cè)試系統(tǒng)已用于測(cè)試用例進(jìn)行測(cè)試,實(shí)際應(yīng)用表明該測(cè)試系統(tǒng)具有測(cè)試準(zhǔn)確、穩(wěn)定可靠、人機(jī)界面友好等特點(diǎn),達(dá)到了設(shè)計(jì)要求。
[1]楊云.P2P音視頻通訊系統(tǒng)的研究與實(shí)現(xiàn)[D].北京:中國地址大學(xué),2006.
[2]伍文華.基于H.263的視頻編解碼器的研究與實(shí)現(xiàn)[D].武漢:華中科技大學(xué),2007.
[3]侯俊杰.深入淺出MFC[M].2版.武漢:華中科技大學(xué)出版社,2001.
[4]王豐錦,邵新宇.基于SOCKET和多線程的應(yīng)用程序間通訊技術(shù)的研究[J].計(jì)算機(jī)應(yīng)用,2000(6):65-67.WANG Feng-jing,SHAO Xin-yu.SOCKET and multithreaded applicationscommunication technology-based research[J].Computer Application,2000(6):65-67.
[5]譚枝梅.基于TCP/IP網(wǎng)絡(luò)的嵌入式平臺(tái)上的視頻會(huì)議系統(tǒng)[D].西安:西北工業(yè)大學(xué),2007.
[6]趙純.數(shù)字視頻采集壓縮系統(tǒng)實(shí)現(xiàn)[D].沈陽:東北大學(xué),2008.
[7]榮治國,陳松喬.實(shí)時(shí)音頻采集、播放技術(shù)的研究[J].計(jì)算機(jī)應(yīng)用研究報(bào),2003(1):134-135.RONG Zhi-guo,CHEN Song-qiao.Real-time audio capture[J].Applications Reported,2003(1):134-135.