摘要:該文介紹了過濾器開發(fā)技術(shù)以及它在遠(yuǎn)程視頻監(jiān)控系統(tǒng)中的應(yīng)用。闡述了使用過濾器開發(fā)技術(shù)在遠(yuǎn)程視頻監(jiān)控系統(tǒng)中實(shí)現(xiàn)網(wǎng)絡(luò)通信模塊的設(shè)計(jì)思想和實(shí)現(xiàn)方法。實(shí)踐表明,過濾器開發(fā)技術(shù)在網(wǎng)絡(luò)通信開發(fā)方面具有很大的優(yōu)勢。
關(guān)鍵詞:過濾器;視頻監(jiān)控;com組件
中圖分類號:TP311文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2008)28-0216-02
Application and Study ofFilter Technology Development in Remote Video Monitoring System
ZHANG Ming-jie
(Department of Information and Management Engineering,Xi’an University of Post and Telecommunications,Xi’an 710061,China)
Abstract: The Filter Technology Development and application in Remote Video Monitoring System are introduced .the design idea and implement method developing the network communications module with Filter Technology in Remote video monitoring system are expatiated. The practice indicated that Filter Technology Development has very big advantage in the field of Network Communication Development.
Key words: filter; video surveillance; component object model
1 引言
遠(yuǎn)程視頻監(jiān)控系統(tǒng)在各個領(lǐng)域有著廣泛的應(yīng)用,它是當(dāng)今大型企業(yè)、銀行、電力局等信息交流廣泛的企業(yè)生產(chǎn)和管理的必備系統(tǒng)。視頻監(jiān)控系統(tǒng)在實(shí)際中具有廣泛的應(yīng)用范圍,其核心在于視頻與音頻的實(shí)時采集、壓縮、傳輸、回放與保存。傳統(tǒng)的視頻監(jiān)控系統(tǒng)對網(wǎng)絡(luò)視頻傳輸多基于VFW技術(shù),因此系統(tǒng)存在通用性差,可擴(kuò)張性不強(qiáng),維護(hù)困難等缺點(diǎn)。本文給出了一種基于過濾器開發(fā)技術(shù)的視頻監(jiān)控系統(tǒng)的網(wǎng)絡(luò)傳輸設(shè)計(jì)方案。此方案在研究開發(fā)遠(yuǎn)程煤礦視頻監(jiān)控系統(tǒng)的過程中,采用Visual C++編程工具,運(yùn)用過濾器開發(fā)技術(shù),實(shí)現(xiàn)了遠(yuǎn)程視頻監(jiān)控系統(tǒng)中的網(wǎng)絡(luò)通信問題。
2 過濾器開發(fā)技術(shù)
Directshow使用模塊化的體系結(jié)構(gòu),最主要的組件是過濾器(Filter),Directshow提供了很多標(biāo)準(zhǔn)過濾器,用戶可以直接使用。但由于媒體格式、壓縮方式、硬件屬性等方面的特殊要求,用戶經(jīng)常需要自行開發(fā)過濾器來滿足具體要求。因此就引入了過濾器開發(fā)技術(shù)。
Directshow為過濾器組件開發(fā)提供了一套基類庫(Base Class Library),包括過濾器基類、針腳基類和一些輔助類?;悗鞛檫^濾器組件的開發(fā)提供了一個框架,省去了復(fù)雜的底層編碼工作。用戶可將開發(fā)工作集中到如下二個方面:傳輸和處理媒體流;將過濾器封裝為COM組件。
1) 媒體流的傳輸和處理
為了傳輸數(shù)據(jù),用戶過濾器先要與過濾器圖中其他過濾器連接起來。連接時要進(jìn)行媒體格式和內(nèi)存分配器的協(xié)調(diào)。過濾器之間通過針腳相連。過濾器之間媒體格式和內(nèi)存分配器的協(xié)調(diào)實(shí)際上是通過針腳之間的通信來完成的。
主動連接方的過濾器的針腳首先獲取自身支持的所有媒體格式,然后把其中一種格式送交給被動連接的一方。被動方的針腳進(jìn)行判斷:如果支持該格式,媒體格式協(xié)調(diào)成功;如果被動方不支持該格式,就通知主動方,主動方再提供1種不同的格式送交被動方,直到被動方支持被提供的格式,協(xié)調(diào)成功,否則,當(dāng)主動方用完所有支持的格式,協(xié)調(diào)失敗。
Directshow過濾器使用一種稱作內(nèi)存分配器(Allocator)的COM對象管理媒體流數(shù)據(jù)。當(dāng)2個過濾器連接前,其中1個過濾器上的針腳提供1個內(nèi)存分配器。另外1個過濾器上的針腳對這個內(nèi)存分配器進(jìn)行檢測。當(dāng)2個針腳都支持該內(nèi)存分配器時,協(xié)調(diào)成功。如圖1所示
媒體流傳輸開始之前,內(nèi)存分配器負(fù)責(zé)創(chuàng)建一系列內(nèi)存緩沖區(qū)。媒體流傳輸時,上游(upstream)過濾器填充這些緩沖區(qū),并把它們傳送給下游(Downstream)過濾器。Directshow使用一種稱作媒體采樣包(Media Sample)的COM對象管理單個緩沖區(qū)。通過控制媒體采樣包對象,可以修改當(dāng)前緩沖區(qū)中的媒體類型、時間戳等信息,也可以利用算法處理媒體數(shù)據(jù),從而實(shí)現(xiàn)對媒體流的處理。
數(shù)據(jù)傳送通常有兩種典型的模式:推模式和拉模式?!巴颇J健敝?,由上游的過濾器主動將數(shù)據(jù)傳遞給下游過濾器,下游過濾器被動接收并對數(shù)據(jù)進(jìn)行處理。“拉模式”中,處于鏈路下游的過濾器主動向上游過濾器提出傳輸數(shù)據(jù)請求,上游的過濾器接收到請求后向下傳遞數(shù)據(jù)。
拉模式常用于傳送媒體文件形式的數(shù)據(jù)。這種數(shù)據(jù)源是靜態(tài)的,本身不能主動把數(shù)據(jù)傳送下去,而要靠后面的過濾器來“拉”。拉模式中,源過濾器的輸出引腳上實(shí)現(xiàn)了一個IAsyncReader接口,下一級過濾器的輸入引腳上建立一個線程,不斷調(diào)用上一級的IAsyncReader接口來獲取數(shù)據(jù)。
推模式方法,實(shí)時視頻源不斷產(chǎn)生視頻幀,源過濾器的輸出引腳使用專門的線程,將媒體實(shí)例不斷地“推”出去。數(shù)據(jù)從源過濾器的輸出引腳出來,源過濾器調(diào)用下一級過濾器輸入引腳上的IMemInput::Receive方法實(shí)現(xiàn)數(shù)據(jù)傳送。推模式常用于實(shí)時視頻源(如視頻采集卡等)。
2) COM組件的實(shí)現(xiàn)
COM組件的實(shí)現(xiàn)包括如下內(nèi)容:用接口規(guī)定過濾器組件對外提供的功能;提供類廠,用以創(chuàng)建COM對象的實(shí)例;提供COM對象所在dll文件的各個輔助函數(shù),以完成COM組件在應(yīng)用程序中的載入和釋放,在注冊表中的注冊和注銷。
Directshow中的過濾器、針腳等COM對象通過接口對外提供各種功能。除了提供標(biāo)準(zhǔn)的接口之外,Directshow還提供了DECLARE_INTERFACE宏讓用戶自定義接口,從而滿足用戶對過濾器組件的指定要求。
COM實(shí)現(xiàn)機(jī)制中用類廠創(chuàng)建COM對象實(shí)例。Directshow提供了類廠類CClassFactory和類廠模板類CFactoryTemplate。通過將不同的類廠模板的內(nèi)容填入類廠,實(shí)現(xiàn)不同的類廠對象,從而創(chuàng)建不同COM對象實(shí)例。
過濾器是dll文件格式的COM組件,需要以下函數(shù):DllMain(載入時的入口)、DllGetClassObject(創(chuàng)建類廠對象)、DllCanUnloadNow(判斷是否釋放dll)、DllRegisterServer(在注冊表中注冊dll)、DllUnregisterServer(在注冊表中反注冊dll)。Directshow已經(jīng)實(shí)現(xiàn)了前3個函數(shù)。后面的2個函數(shù)通常調(diào)用Directshow中的函數(shù)AmovieDllRegisterServer2()來實(shí)現(xiàn),即:
STDAPIDllRegisterServer()
{ returnAmovieDllRegisterServer2(TRUE);}
STDAPIDllUnregisterServer()
{ returnAmovieDllRegisterServer2(FALSE);}
3 過濾器開發(fā)技術(shù)在遠(yuǎn)程視頻監(jiān)控系統(tǒng)中的應(yīng)用
筆者在研究遠(yuǎn)程視頻監(jiān)控系統(tǒng)中使用過濾器開發(fā)技術(shù)開發(fā)了網(wǎng)絡(luò)通信模塊,網(wǎng)絡(luò)通信模塊的實(shí)現(xiàn)流程如圖2所示系統(tǒng)的網(wǎng)絡(luò)通信部分的主要功能是以組播方式發(fā)送和接受網(wǎng)絡(luò)視頻流,網(wǎng)絡(luò)通信部分的實(shí)現(xiàn)主要是網(wǎng)絡(luò)傳輸過濾器的開發(fā),包括網(wǎng)絡(luò)發(fā)送過濾器和網(wǎng)絡(luò)接收過濾器兩部分。網(wǎng)絡(luò)發(fā)送過濾器用于處理經(jīng)壓縮編碼過濾器編碼后的視頻流,將數(shù)據(jù)流分塊打包后發(fā)送出去,網(wǎng)絡(luò)接收過濾器用于從網(wǎng)絡(luò)獲取媒體數(shù)據(jù)并將數(shù)據(jù)傳送到下一級解碼過濾器。本系統(tǒng)中網(wǎng)絡(luò)過濾器的開發(fā)是以微軟DirectX9.0 SDK示例為基礎(chǔ)實(shí)現(xiàn)的。
■
圖2 視頻網(wǎng)絡(luò)通信流程圖
4 網(wǎng)絡(luò)通信過濾器的實(shí)現(xiàn)
1) 網(wǎng)絡(luò)過濾器的基本框架
Class CInputPin//定義過濾器輸入引腳類由CBaseInputPin派生
Class CNetworkSend//定義一個由CBaseFilter基類派生的類
Class CNetOutputPin//定義過濾器輸出引腳類由CBaseOutputPin派生
Class CNetworkReceiverFilter//定義一個由CBase Filter基類派生的類
使用的主要函數(shù)說明如下:
HRESULT CNetOutputPin::GetMediaType(IN int iPosition,OUT CMediaType *pmt);
//連接時得到媒體類型
HRESULT CNetOutputPin::CheckMediaType(IN const CMediaType *pmt);
//連接時檢查媒體類型
HRESULT
CNetOutputPin::DecideBufferSize(IN IMemAllocator *,OUT ALLOCATOR_PROPERTIES *);//指定每個采樣包的大小
在具體實(shí)現(xiàn)中,我們要考慮所采用的視頻編解碼器的媒體格式的特征,在這里我采用了DivXNetworks公司的DivX5.02編解碼器來實(shí)現(xiàn)視頻圖像的壓縮、解壓縮編碼處理,基于它的媒體格式的特征,在GetMediaType函數(shù)中定義了媒體格式代碼如下:
網(wǎng)絡(luò)發(fā)送過濾器中GetMediaType函數(shù)的部分代碼:
CMediaType *pmt;
pmt->SetType(MEDIATYPE_Video);//設(shè)置媒體主類型
pmt->SetSubtype(TIME_FORMAT_NONE);//設(shè)置媒體次類型為任意類型
網(wǎng)絡(luò)接收過濾器中GetMediaType函數(shù)的部分代碼:
pmt->SetType(MEDIATYPE_Video);//設(shè)置媒體主類型
pmt->SetSubtype(DIVX);//設(shè)置媒體次類型為DIVX
pmt->SetFormatType(FORMAT_VideoInfo);//設(shè)置媒體格式
pmt->SetSampleSize(pvi->bmiHeader.biSizeImage);//設(shè)置媒體采樣包大小
5 結(jié)束語
本文主要討論了過濾器開發(fā)技術(shù)在遠(yuǎn)程視頻監(jiān)控系統(tǒng)中的應(yīng)用以及在網(wǎng)絡(luò)通信中的具體實(shí)現(xiàn)方法。事實(shí)證明:利用過濾器開發(fā)技術(shù)可以方便高效地實(shí)現(xiàn)視頻數(shù)據(jù)的傳輸,很好地解決了監(jiān)控系統(tǒng)中通用性差、可擴(kuò)展性不強(qiáng)的問題。筆者在研究開發(fā)煤礦安全視頻監(jiān)控系統(tǒng)中,實(shí)現(xiàn)了基于過濾器開發(fā)技術(shù)的遠(yuǎn)程監(jiān)控系統(tǒng)網(wǎng)絡(luò)通信模塊,在應(yīng)用中效果很好。
參考文獻(xiàn):
[1] 陸其明.Directshow開發(fā)指南[M].北京:清華大學(xué)出版社,2003:1-7.
[2] 胡毅,胡詠梅.基于網(wǎng)絡(luò)的多媒體遠(yuǎn)程監(jiān)視系統(tǒng)的研究與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用研究,2000,17(9):100-102.
[3] 莊嚴(yán).一種基于Directshow的實(shí)時視頻傳輸實(shí)現(xiàn)方法[J].南京工業(yè)大學(xué)學(xué)報(bào),2003,26(6):85-89.