摘要:該文介紹了過濾器開發技術以及它在遠程視頻監控系統中的應用。闡述了使用過濾器開發技術在遠程視頻監控系統中實現網絡通信模塊的設計思想和實現方法。實踐表明,過濾器開發技術在網絡通信開發方面具有很大的優勢。
關鍵詞:過濾器;視頻監控;com組件
中圖分類號:TP311文獻標識碼: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 引言
遠程視頻監控系統在各個領域有著廣泛的應用,它是當今大型企業、銀行、電力局等信息交流廣泛的企業生產和管理的必備系統。視頻監控系統在實際中具有廣泛的應用范圍,其核心在于視頻與音頻的實時采集、壓縮、傳輸、回放與保存。傳統的視頻監控系統對網絡視頻傳輸多基于VFW技術,因此系統存在通用性差,可擴張性不強,維護困難等缺點。本文給出了一種基于過濾器開發技術的視頻監控系統的網絡傳輸設計方案。此方案在研究開發遠程煤礦視頻監控系統的過程中,采用Visual C++編程工具,運用過濾器開發技術,實現了遠程視頻監控系統中的網絡通信問題。
2 過濾器開發技術
Directshow使用模塊化的體系結構,最主要的組件是過濾器(Filter),Directshow提供了很多標準過濾器,用戶可以直接使用。但由于媒體格式、壓縮方式、硬件屬性等方面的特殊要求,用戶經常需要自行開發過濾器來滿足具體要求。因此就引入了過濾器開發技術。
Directshow為過濾器組件開發提供了一套基類庫(Base Class Library),包括過濾器基類、針腳基類和一些輔助類。基類庫為過濾器組件的開發提供了一個框架,省去了復雜的底層編碼工作。用戶可將開發工作集中到如下二個方面:傳輸和處理媒體流;將過濾器封裝為COM組件。
1) 媒體流的傳輸和處理
為了傳輸數據,用戶過濾器先要與過濾器圖中其他過濾器連接起來。連接時要進行媒體格式和內存分配器的協調。過濾器之間通過針腳相連。過濾器之間媒體格式和內存分配器的協調實際上是通過針腳之間的通信來完成的。
主動連接方的過濾器的針腳首先獲取自身支持的所有媒體格式,然后把其中一種格式送交給被動連接的一方。被動方的針腳進行判斷:如果支持該格式,媒體格式協調成功;如果被動方不支持該格式,就通知主動方,主動方再提供1種不同的格式送交被動方,直到被動方支持被提供的格式,協調成功,否則,當主動方用完所有支持的格式,協調失敗。
Directshow過濾器使用一種稱作內存分配器(Allocator)的COM對象管理媒體流數據。當2個過濾器連接前,其中1個過濾器上的針腳提供1個內存分配器。另外1個過濾器上的針腳對這個內存分配器進行檢測。當2個針腳都支持該內存分配器時,協調成功。如圖1所示
媒體流傳輸開始之前,內存分配器負責創建一系列內存緩沖區。媒體流傳輸時,上游(upstream)過濾器填充這些緩沖區,并把它們傳送給下游(Downstream)過濾器。Directshow使用一種稱作媒體采樣包(Media Sample)的COM對象管理單個緩沖區。通過控制媒體采樣包對象,可以修改當前緩沖區中的媒體類型、時間戳等信息,也可以利用算法處理媒體數據,從而實現對媒體流的處理。
數據傳送通常有兩種典型的模式:推模式和拉模式。“推模式”中,由上游的過濾器主動將數據傳遞給下游過濾器,下游過濾器被動接收并對數據進行處理。“拉模式”中,處于鏈路下游的過濾器主動向上游過濾器提出傳輸數據請求,上游的過濾器接收到請求后向下傳遞數據。
拉模式常用于傳送媒體文件形式的數據。這種數據源是靜態的,本身不能主動把數據傳送下去,而要靠后面的過濾器來“拉”。拉模式中,源過濾器的輸出引腳上實現了一個IAsyncReader接口,下一級過濾器的輸入引腳上建立一個線程,不斷調用上一級的IAsyncReader接口來獲取數據。
推模式方法,實時視頻源不斷產生視頻幀,源過濾器的輸出引腳使用專門的線程,將媒體實例不斷地“推”出去。數據從源過濾器的輸出引腳出來,源過濾器調用下一級過濾器輸入引腳上的IMemInput::Receive方法實現數據傳送。推模式常用于實時視頻源(如視頻采集卡等)。
2) COM組件的實現
COM組件的實現包括如下內容:用接口規定過濾器組件對外提供的功能;提供類廠,用以創建COM對象的實例;提供COM對象所在dll文件的各個輔助函數,以完成COM組件在應用程序中的載入和釋放,在注冊表中的注冊和注銷。
Directshow中的過濾器、針腳等COM對象通過接口對外提供各種功能。除了提供標準的接口之外,Directshow還提供了DECLARE_INTERFACE宏讓用戶自定義接口,從而滿足用戶對過濾器組件的指定要求。
COM實現機制中用類廠創建COM對象實例。Directshow提供了類廠類CClassFactory和類廠模板類CFactoryTemplate。通過將不同的類廠模板的內容填入類廠,實現不同的類廠對象,從而創建不同COM對象實例。
過濾器是dll文件格式的COM組件,需要以下函數:DllMain(載入時的入口)、DllGetClassObject(創建類廠對象)、DllCanUnloadNow(判斷是否釋放dll)、DllRegisterServer(在注冊表中注冊dll)、DllUnregisterServer(在注冊表中反注冊dll)。Directshow已經實現了前3個函數。后面的2個函數通常調用Directshow中的函數AmovieDllRegisterServer2()來實現,即:
STDAPIDllRegisterServer()
{ returnAmovieDllRegisterServer2(TRUE);}
STDAPIDllUnregisterServer()
{ returnAmovieDllRegisterServer2(FALSE);}
3 過濾器開發技術在遠程視頻監控系統中的應用
筆者在研究遠程視頻監控系統中使用過濾器開發技術開發了網絡通信模塊,網絡通信模塊的實現流程如圖2所示系統的網絡通信部分的主要功能是以組播方式發送和接受網絡視頻流,網絡通信部分的實現主要是網絡傳輸過濾器的開發,包括網絡發送過濾器和網絡接收過濾器兩部分。網絡發送過濾器用于處理經壓縮編碼過濾器編碼后的視頻流,將數據流分塊打包后發送出去,網絡接收過濾器用于從網絡獲取媒體數據并將數據傳送到下一級解碼過濾器。本系統中網絡過濾器的開發是以微軟DirectX9.0 SDK示例為基礎實現的。
■
圖2 視頻網絡通信流程圖
4 網絡通信過濾器的實現
1) 網絡過濾器的基本框架
Class CInputPin//定義過濾器輸入引腳類由CBaseInputPin派生
Class CNetworkSend//定義一個由CBaseFilter基類派生的類
Class CNetOutputPin//定義過濾器輸出引腳類由CBaseOutputPin派生
Class CNetworkReceiverFilter//定義一個由CBase Filter基類派生的類
使用的主要函數說明如下:
HRESULT CNetOutputPin::GetMediaType(IN int iPosition,OUT CMediaType *pmt);
//連接時得到媒體類型
HRESULT CNetOutputPin::CheckMediaType(IN const CMediaType *pmt);
//連接時檢查媒體類型
HRESULT
CNetOutputPin::DecideBufferSize(IN IMemAllocator *,OUT ALLOCATOR_PROPERTIES *);//指定每個采樣包的大小
在具體實現中,我們要考慮所采用的視頻編解碼器的媒體格式的特征,在這里我采用了DivXNetworks公司的DivX5.02編解碼器來實現視頻圖像的壓縮、解壓縮編碼處理,基于它的媒體格式的特征,在GetMediaType函數中定義了媒體格式代碼如下:
網絡發送過濾器中GetMediaType函數的部分代碼:
CMediaType *pmt;
pmt->SetType(MEDIATYPE_Video);//設置媒體主類型
pmt->SetSubtype(TIME_FORMAT_NONE);//設置媒體次類型為任意類型
網絡接收過濾器中GetMediaType函數的部分代碼:
pmt->SetType(MEDIATYPE_Video);//設置媒體主類型
pmt->SetSubtype(DIVX);//設置媒體次類型為DIVX
pmt->SetFormatType(FORMAT_VideoInfo);//設置媒體格式
pmt->SetSampleSize(pvi->bmiHeader.biSizeImage);//設置媒體采樣包大小
5 結束語
本文主要討論了過濾器開發技術在遠程視頻監控系統中的應用以及在網絡通信中的具體實現方法。事實證明:利用過濾器開發技術可以方便高效地實現視頻數據的傳輸,很好地解決了監控系統中通用性差、可擴展性不強的問題。筆者在研究開發煤礦安全視頻監控系統中,實現了基于過濾器開發技術的遠程監控系統網絡通信模塊,在應用中效果很好。
參考文獻:
[1] 陸其明.Directshow開發指南[M].北京:清華大學出版社,2003:1-7.
[2] 胡毅,胡詠梅.基于網絡的多媒體遠程監視系統的研究與實現[J].計算機應用研究,2000,17(9):100-102.
[3] 莊嚴.一種基于Directshow的實時視頻傳輸實現方法[J].南京工業大學學報,2003,26(6):85-89.