摘 要:隨著社會(huì)的不斷發(fā)展和進(jìn)步,監(jiān)控系統(tǒng)在各行各業(yè)越來(lái)越廣泛的被應(yīng)用,監(jiān)控已經(jīng)從零散逐步走向集成化。本文首先分析了幾種常用的數(shù)據(jù)采集方式,并對(duì)在VC++環(huán)境能采用的采集方式做了分析和說(shuō)明。接著分析了視頻信號(hào)的預(yù)覽、錄像功能及視頻回放功能的實(shí)現(xiàn)等。
關(guān)鍵詞:VC++;視頻;通道
中圖分類(lèi)號(hào):TP391
1 視頻的采集分析
常用的視頻采集方法有VWF、DirectShow和SDK三種。最早使用的是VWF,它是由一組庫(kù)函數(shù)組成的數(shù)字視頻軟件包。是Microsoft公司推出用于實(shí)現(xiàn)視頻捕捉、影像視頻壓縮及影像播放的。雖然它是隨使Windows操作系統(tǒng)一起安裝,可執(zhí)行文件不需要附帶額外的庫(kù)文件就可以運(yùn)行, VFW最致命的弱點(diǎn)是和一般的視頻卡不兼容,所以在視頻采集中一般不考慮用VFW技術(shù)。DirectShow支持多種媒體格式,比如ASF、MPEG、AVI、MP3、WAV,因?yàn)槿绱怂菀讓?shí)現(xiàn)媒體數(shù)據(jù)的采集、回放。SDK采集方式和上面兩種不一樣,它是監(jiān)控卡廠(chǎng)家提供的開(kāi)發(fā)視頻監(jiān)控的一組庫(kù)函數(shù),在用戶(hù)按照自己的需求使用SDK庫(kù)函數(shù),不需要了解視頻壓縮、回放、網(wǎng)絡(luò)傳輸技術(shù),利用函數(shù)進(jìn)行視頻開(kāi)發(fā)。本文以海康威視提供的SDK為例。視頻畫(huà)面的分割與預(yù)覽
將多個(gè)檢測(cè)點(diǎn)的視頻圖像同時(shí)在一臺(tái)計(jì)算機(jī)進(jìn)行顯示就需要視頻畫(huà)面的分割與預(yù)覽。在開(kāi)發(fā)中,CEdit控件是實(shí)現(xiàn)視頻畫(huà)面的分割與預(yù)覽的。因?yàn)轭?lèi)具有的繼承性,所以定義一個(gè)新的Ceditwin類(lèi),在該類(lèi)中增加一個(gè)能實(shí)現(xiàn)視頻的預(yù)覽、畫(huà)面的分割等功能成員函數(shù)disp() 。一般控制需要監(jiān)控程序一運(yùn)行就能夠進(jìn)入預(yù)覽畫(huà)面,這一功能的實(shí)現(xiàn)是在Ceditwin類(lèi)的WM_PAINT消息處理函數(shù)OnPaint() 中調(diào)用了顯示函數(shù) disp() ,多畫(huà)面預(yù)覽是在該函數(shù)中通過(guò)視頻采集卡提供的StartVideoPreview() 函數(shù)實(shí)現(xiàn)的。StartVideoPreview() 函數(shù)能完成的功能比較多,使用也方便,這個(gè)函數(shù)的使用格式如下:
其定義為:int __stdcall StartVideoPreview(HANDLE hChannelHandle,HWND WndHandle, RECT *rect,BOOLEAN bOverlay, int VideoFormat, int FrameRate)
這個(gè)函數(shù)的參數(shù)和功能如下所示:
通道句柄 HANDLE hChannelHandle;
顯示窗口句柄 HWND WndHandle;
顯示窗口內(nèi)的矩形區(qū)域 RECT *rect;
是否啟用Overlay預(yù)覽模式 BOOLEAN bOverlay; *
視頻預(yù)覽格式(目前無(wú)效 int VideoFormat;)
視頻預(yù)覽幀率(PAL:1-25,NTSC:1-30)int FrameRate;
這個(gè)函數(shù)被調(diào)后返回值:0是成功返回;如果失敗則返回錯(cuò)誤號(hào)。
需要特別說(shuō)明的是,這個(gè)函數(shù)的功能是啟動(dòng)視頻預(yù)覽。其參數(shù)較多,其中通道句柄確定了要顯示的通道號(hào)或檢測(cè)點(diǎn),窗口句柄則是指圖像在哪個(gè)控件上顯示,在該系統(tǒng)中,圖像在Cedit控件中顯示。顯示窗口內(nèi)的矩形區(qū)域,指明了當(dāng)前通道號(hào)的圖像信息的顯示位置,正因?yàn)橛辛诉@個(gè)參數(shù),我們將Cedit控件的整個(gè)區(qū)域可劃分為一系列小矩形,每個(gè)矩形區(qū)域可顯示一路圖像,實(shí)現(xiàn)了多畫(huà)面的分割與顯示。顯示模式置為Overlay模式,視頻預(yù)覽幀率置為25,這樣視頻圖像連續(xù)順暢,沒(méi)有遲鈍的現(xiàn)象。多畫(huà)面預(yù)覽的設(shè)計(jì)思路如下所示。
圖1 畫(huà)面的分割與預(yù)覽流程圖
在上面的流程圖中,畫(huà)面的顯示是通過(guò)顯示方式在disp() 函數(shù)中判斷是單畫(huà)面還是多畫(huà)面,然后通過(guò)調(diào)用啟動(dòng)視頻預(yù)覽函數(shù)StartVideoPreview() 在相應(yīng)的區(qū)域中顯示圖像實(shí)現(xiàn)的。
當(dāng)對(duì)某一通道的畫(huà)面進(jìn)行雙擊或通過(guò)豬舍選擇框進(jìn)行豬舍號(hào)選擇時(shí),預(yù)覽畫(huà)面從多通道界面切換到當(dāng)前所選擇的豬舍畫(huà)面。實(shí)現(xiàn)的方法是當(dāng)進(jìn)行雙擊或進(jìn)行通道切換后,將顯示方式置為單界面方式,接著置當(dāng)前通道號(hào),然后調(diào)用顯示函數(shù)disp() 便實(shí)現(xiàn)了通道的切換。
2 視頻錄像的開(kāi)發(fā)
一般情況下監(jiān)控不僅僅只為了簡(jiǎn)單的監(jiān)控,能看見(jiàn)畫(huà)面就行,還要求能夠?qū)崿F(xiàn)錄像。如果需要對(duì)所選擇的通道進(jìn)行錄像時(shí),單擊“錄像”按鈕,這一按鈕就會(huì)變成“監(jiān)控”,這些功能是通過(guò)響應(yīng)OnRec() 函數(shù)實(shí)現(xiàn)的同時(shí)實(shí)現(xiàn)對(duì)所選擇的通道進(jìn)行錄像;當(dāng)再次單擊“監(jiān)控”按鈕時(shí),按鈕標(biāo)題變?yōu)椤颁浵瘛?,此時(shí)停止了錄像。
對(duì)視頻信息的錄像,簡(jiǎn)單地說(shuō)就是將視頻采集卡提供的合法數(shù)據(jù)流寫(xiě)到指定的文件下。比如??狄曨l采集卡提供的數(shù)據(jù)流信息如下:
非法幀數(shù)據(jù) PktError
系統(tǒng)頭PktSysHeader
幀包 PktIFrames I
幀包 PktPFrames P
幀包 PktBBPFrames BBP
音頻幀包 PktAudioFrames
動(dòng)態(tài)監(jiān)測(cè)包 PktMotionDetection
在一般的系統(tǒng)中,對(duì)數(shù)據(jù)流的捕獲,使用的是直接讀取方式,通過(guò)直接讀取回調(diào)函數(shù) StreamDirectReadCallback() 直接對(duì)用編碼數(shù)據(jù)流數(shù)進(jìn)行處理。使用這一函數(shù)時(shí)必須在初始化函數(shù)中通過(guò)注冊(cè)編碼圖像數(shù)據(jù)流直接讀取回調(diào)函數(shù)注冊(cè)RegisterStreamDirectReadCallback(::StreamDirectReadCallback,this) 后,才能直接讀取。
實(shí)現(xiàn)錄像的過(guò)程為:?jiǎn)?dòng)StartVideoCapture(m_ChanHandle[ilastselect]) 主通道編碼數(shù)據(jù)流捕獲函數(shù),然后由StreamDirectReadCallback() 檢測(cè)視頻采集卡的數(shù)據(jù)流的地址、長(zhǎng)度、幀類(lèi)型等,接著在該函數(shù)中判斷是否為非法幀數(shù)據(jù)PktError或動(dòng)態(tài)監(jiān)測(cè)包PktMotionDetection,如不是這兩類(lèi)數(shù)據(jù)信息,則捕獲的數(shù)據(jù)寫(xiě)入打開(kāi)的文件中,如果是這兩類(lèi)信息,則不處理,這樣便實(shí)現(xiàn)了錄像的功能。
視頻錄像的回放是通過(guò)調(diào)用播放工具來(lái)回放保存在硬盤(pán)中的錄像文件的。
3 小結(jié)
視頻信號(hào)的分割、預(yù)覽、切換既可以對(duì)所有監(jiān)控現(xiàn)場(chǎng)的景象同時(shí)進(jìn)行預(yù)覽,也可以對(duì)某一個(gè)現(xiàn)場(chǎng)的影像進(jìn)行單畫(huà)面預(yù)覽,還可以方便地切換到另一通道。同時(shí)對(duì)當(dāng)前現(xiàn)場(chǎng)的景象進(jìn)行錄像功能的實(shí)現(xiàn),更進(jìn)一步的起到分析和監(jiān)督的作用。
在實(shí)際的運(yùn)行,這種視頻監(jiān)視界面美觀(guān)大方,人機(jī)交互性強(qiáng),參數(shù)設(shè)置方便,顯示直觀(guān),操作簡(jiǎn)單。對(duì)攝像裝置的運(yùn)動(dòng)控制靈活方便,
視頻監(jiān)視模塊的開(kāi)發(fā)與設(shè)計(jì)完全達(dá)到了監(jiān)視功能的要求,操作簡(jiǎn)單方便,運(yùn)行可靠穩(wěn)定。視頻監(jiān)視功能對(duì)于提高管理水平,降低風(fēng)險(xiǎn)有積極的意義。
參考文獻(xiàn):
[1]齊舒.C++6.0開(kāi)發(fā)技巧及實(shí)例剖析[M].北京:清華大學(xué)出版社,2000.
[2]宋坤,劉銳寧.Visual C++視頻技術(shù)方案寶典[M].北京:人民郵電出版社,2008.
作者簡(jiǎn)介:楊至輝(1977.10-),男,甘肅會(huì)寧人,講師,學(xué)士,研究方向:計(jì)算機(jī)科學(xué)與技術(shù)。