摘要:文章主要對數(shù)字視頻監(jiān)控系統(tǒng)中的軟件設(shè)計(jì)方案進(jìn)行了分析,并提出了解決方案。
關(guān)鍵詞:數(shù)字視頻監(jiān)控;軟件設(shè)計(jì);C/S模型
我國視頻監(jiān)控行業(yè)最初是由閉路電視監(jiān)控逐漸發(fā)展起來的,已近二十年的歷史,但總的來講,由于起步晚,技術(shù)較落后,使該行業(yè)中的我國企業(yè)既有廣闊的發(fā)展空間,又面臨著來自國外大企業(yè)的強(qiáng)大挑戰(zhàn)。就目前先進(jìn)的數(shù)字視頻監(jiān)控系統(tǒng)而言,在視頻壓縮、分析、傳輸、存儲和分級控制等方面仍有待提高和完善。本文主要對數(shù)字視頻監(jiān)控系統(tǒng)中的軟件設(shè)計(jì)方案進(jìn)行了分析,并提出了解決方案。
一、系統(tǒng)軟件結(jié)構(gòu)特點(diǎn)
(一)系統(tǒng)模塊化,具有較好的擴(kuò)展性、可重用性和可維護(hù)性
系統(tǒng)按照功能劃分模塊,模塊之間具有相對的獨(dú)立性。可以通過增加或替換模塊,對系統(tǒng)進(jìn)行擴(kuò)展;另外,利用關(guān)鍵模塊可以開發(fā)新的視頻應(yīng)用系統(tǒng),避免了重復(fù)開發(fā)的麻煩,使系統(tǒng)具有良好的可重用性。
(二)集中管理,具有較高的可靠性、統(tǒng)一性和安全性
設(shè)置管理服務(wù)器對所有成員進(jìn)行集中式管理:組成員加入或退出監(jiān)控組的行為必需通過組管理服務(wù)器進(jìn)行認(rèn)證或登記。采取集中式管理有利于提高系統(tǒng)的統(tǒng)一性、可靠性和安全性。
?。ㄈ┨峁╈`活監(jiān)控方式
授權(quán)用戶可隨時隨地加入監(jiān)控系統(tǒng)進(jìn)行實(shí)時監(jiān)控,增加了用戶進(jìn)行監(jiān)控的靈活性。
二、系統(tǒng)軟件的C/S模型
隨著計(jì)算機(jī)和網(wǎng)絡(luò)技術(shù)的發(fā)展,很多數(shù)據(jù)處理系統(tǒng)都采用開放系統(tǒng)結(jié)構(gòu)的客戶機(jī)-服務(wù)器(Client/Server)模型,即客戶機(jī)向服務(wù)器提出請求,服務(wù)器對請求做相應(yīng)的處理并執(zhí)行被請求的任務(wù),然后將結(jié)果返回給客戶機(jī)。
基于以上的分析,監(jiān)控軟件的設(shè)計(jì)采用了客戶機(jī)一服務(wù)器模型。如圖1所示,在服務(wù)器端對請求做出回應(yīng)并執(zhí)行相應(yīng)的任務(wù),如給客戶端發(fā)送組播地址、視音頻圖像、控制指令等。客戶機(jī)向服務(wù)器發(fā)送請求,并接收視音頻圖像,譯碼播放及一定權(quán)限下的控制指令。服務(wù)器則根據(jù)要求向當(dāng)前設(shè)備狀態(tài)發(fā)出控制指令,從而實(shí)現(xiàn)遠(yuǎn)程監(jiān)控。
三、系統(tǒng)軟件模塊
本系統(tǒng)主要由視音頻數(shù)據(jù)處理模塊、視音頻錄像播放模塊、云鏡控制模塊、系統(tǒng)參數(shù)設(shè)置模塊、視音頻數(shù)據(jù)發(fā)送模塊、視音頻數(shù)據(jù)接收模塊六個部分組成。如圖2所示。其中,前五個模塊運(yùn)行于監(jiān)控服務(wù)器端,視音頻數(shù)據(jù)接收模塊運(yùn)行于遠(yuǎn)程客戶端,另外,遠(yuǎn)程客戶端也有負(fù)責(zé)視音頻播放的模塊,但同服務(wù)器端的視音頻數(shù)據(jù)處理模塊實(shí)現(xiàn)方式差不多,所以不再贅述。各模塊的主要功能見圖2:
視音頻數(shù)據(jù)處理模塊該模塊主要通過視音頻壓縮卡廠商提供的SDK開發(fā)包,完成對視音頻信號進(jìn)行實(shí)時采集、動態(tài)存儲、實(shí)時播放等處理工作;視音頻錄像播放模塊該模塊主要對存儲在硬盤上的視音頻檔進(jìn)行按條件查詢播放;云鏡控制模塊該模塊負(fù)責(zé)根據(jù)譯碼器協(xié)議及命令碼,通過串口通信控制云臺的轉(zhuǎn)動、鏡頭的焦距和光圈的調(diào)整等;系統(tǒng)參數(shù)設(shè)置模塊該模塊主要對系統(tǒng)的一些參數(shù)進(jìn)行設(shè)置,如增加用戶、刪除用戶、存儲設(shè)置、視頻采集參數(shù)設(shè)置等;視音頻數(shù)據(jù)發(fā)送模塊該模塊負(fù)責(zé)將視音頻數(shù)據(jù)流實(shí)時的以組播的方式發(fā)送給遠(yuǎn)程監(jiān)控端;視音頻數(shù)據(jù)接收模塊該模塊運(yùn)行于遠(yuǎn)程客戶端,負(fù)責(zé)接收監(jiān)控服務(wù)器發(fā)送來的視音頻數(shù)據(jù)流。
四、系統(tǒng)軟件主要功能模塊實(shí)現(xiàn)
(一)視頻采集模塊
視頻采集模塊將視頻采集卡采集到的視頻圖像置入內(nèi)存,系統(tǒng)讀取內(nèi)存中的視頻圖像后才能作后續(xù)處理.圖像采集時以幀方式采集,在內(nèi)存中以場方式存儲。
由于采集卡在不斷地向采集緩沖區(qū)寫入數(shù)據(jù),讀取視頻數(shù)據(jù)時需要涉及到臨界區(qū)訪問的問題.系統(tǒng)首先要查詢哪塊采集緩沖區(qū)已就緒,然后鎖定要采集的采集緩沖區(qū),接著讀取視頻資料,最后對視頻數(shù)據(jù)進(jìn)行顯示,或者交給壓縮模塊處理。
在視頻服務(wù)器中,一個服務(wù)器需要同時連接多個攝像頭,因此視頻信號的采集、處理應(yīng)該同步執(zhí)行。本系統(tǒng)使用了多線程技術(shù),分別為每一路視頻信號的處理啟動單獨(dú)的線程。此外,考慮到監(jiān)控系統(tǒng)實(shí)時性要求較高,本系統(tǒng)以多媒體定時器方式啟動線程,多媒體定時器可以精確到毫秒級。以下是啟動函數(shù)及其參數(shù)介紹:
MMRESULT timeSetEvent(UINT uDeiay,UINT uResolution,LPTIMECALL-BACK IpTimeProc,DWORD-PTR dwUser,DINT fuEvent)
uDelay:以毫秒指定事件的周期.
uResolution:以毫秒指定延遲的精度,數(shù)值越小,定時器越精確,在Windows中缺省值為lms.
IpTimeProc:回調(diào)函數(shù),為用戶自定義函數(shù)(本例中應(yīng)為視頻圖像處理函數(shù))。
dwUser:用戶參數(shù).
fuEvent:指定定時器事件類型. TIME_ ONESHOT:執(zhí)行一次.TIME _ PERIODIC:周期性執(zhí)行(顯然本例中應(yīng)取后者)
?。ǘ┮曨l處理模塊
對視頻信號壓縮,我們采用MPEG-4標(biāo)準(zhǔn),視頻信號的回放,運(yùn)用DirectDraw技術(shù)直接寫屏,以滿足25f/s的視頻回放要求。
以下是視頻信號壓縮一幀圖像的函數(shù),nID為采集設(shè)備編號,pBuf In為采集到的圖像數(shù)據(jù),PBufOut為壓縮后的圖像數(shù)據(jù),pOutSize為壓縮后的圖像大小,pKeyFrame表明當(dāng)前圖像是否為關(guān)鍵幀。
BOOL C_CompressFrame ( int nID, char * pBufIn,char * * pBufOut, unsigned int * pOutSize,
BOOL * pKeyFrame)
{
SCompressInfo * pCmprssInfo=&g_-CmprssInfo[nID];
* pBufOut=(char*)ICSeqCompress-Frame( &pCmprssInfo?>cv , 0 , pBufIn,
pKeyFrame, ( long*)pOutSize );
return TRUE
}
?。ㄈ┚W(wǎng)絡(luò)傳輸模塊
在網(wǎng)絡(luò)通信中能否恰當(dāng)?shù)厥褂脜f(xié)議對整個系統(tǒng)而言非常關(guān)鍵。本系統(tǒng)采用TCP/IP來完成網(wǎng)絡(luò)通信和數(shù)據(jù)傳輸。TCP具有保證數(shù)據(jù)包發(fā)送到所需目標(biāo)系統(tǒng)并按恰當(dāng)順序發(fā)送與重新裝配數(shù)據(jù)的能力如果數(shù)據(jù)包有問題,TCP就要確保重新發(fā)送出現(xiàn)傳輸問題的數(shù)據(jù)。因此,TCP為了確保數(shù)據(jù)的正確接收,要產(chǎn)生額外的網(wǎng)絡(luò)信息量并降低整個網(wǎng)絡(luò)的性能。用戶數(shù)據(jù)包協(xié)議(UDP)與TCP類似,但UDP能夠不用校驗(yàn)或不要求應(yīng)答數(shù)據(jù)包的發(fā)送,因此UDP主要應(yīng)用在對網(wǎng)絡(luò)延遲敏感但可承受數(shù)據(jù)損失,以及一對多等場合考慮到視頻信號的傳送和控制信號的傳送對數(shù)據(jù)可靠性的要求不同。數(shù)據(jù)量不同,我們用UDP實(shí)現(xiàn)視頻數(shù)據(jù)傳送,用TCP實(shí)現(xiàn)控制信號傳送。當(dāng)然,使用UDP協(xié)議在網(wǎng)絡(luò)流量大的情況下會對圖像質(zhì)量產(chǎn)生一定的影響。
下面為本模塊使用的用于網(wǎng)絡(luò)監(jiān)聽的CListeningSockct對象。
class CListeningSocket:public Csocket
}
//對象屬性
public:
//對象方法
public:
CListeningSocket(CMainFrame } pMainFrame
virtual一CListeningSocket();
//重載
public:
CMainFrame * m_pMainFrame; //虛函數(shù)重載
//{{AFX_VIRTUAL(CListeningSocket)
public:
virtual void OnAccept(int nErrorCode);
//}}AFX_VIRTUAL
//產(chǎn)生消息映像
//{{AFX_MSG(CListeningSocket)
//可以在此增減成員函數(shù)
//}}AFX_MSG
//具體實(shí)現(xiàn)
protected:
};
該對象每當(dāng)監(jiān)聽到一個連接請求時,即建立一個新的CSocket與其通信,并將其連到鏈表上,原對象本身繼續(xù)保持監(jiān)聽。具體實(shí)現(xiàn)過程如下:
void CListeningSocket::OnAccept(int nErrorCode)
{
// TODO:Add your specialized code here and/or call the base class
CSockct:OnAcccpt( nErrorCode );
CCIientSocket*pSocket=new CClientSocket(m_pMainFrame);
if ( pSocket==NULL)
return;
if(m_pMainFrame->m_ListeningSocket->Accept(* pSocket))
{m_pMainFrame->m_ConnectionList. Add
Tail( pSocket );
}
else
delete pSocket;
文章提出了本數(shù)字視頻監(jiān)控系統(tǒng)中軟件設(shè)計(jì)的C/S模型,根據(jù)模型具體劃分系統(tǒng)模塊,分析介紹系統(tǒng)主要模塊的設(shè)計(jì)思想并對軟件開發(fā)過程中的問題提出了解決方法。
參考文獻(xiàn):
1、韋錦山.網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng)的新發(fā)展.通訊世界[J].2002(5):65-68.
2、劉富強(qiáng).數(shù)字視頻監(jiān)控系統(tǒng)開發(fā)及應(yīng)用[M].機(jī)械工業(yè)出版社,2003.
3、余兆明,李曉飛等.“MPEG標(biāo)準(zhǔn)及其應(yīng)用”[M].北京郵電大學(xué)出版社,2002.
?。ㄗ髡邌挝唬何錆h理工大學(xué))