李 勇,彭 宏
(浙江工業(yè)大學通信與信息系統系,浙江杭州310023)
近年來,計算機網絡和多媒體技術快速發(fā)展,它們已經被廣泛應用于數字監(jiān)控、可視電話、遠程教育和醫(yī)療等諸多工程領域。而在這些領域中最首要的問題是實時視頻信息的采集與壓縮,同時,它們也是多媒體開發(fā)應用的關鍵前提。目前國際上通用的視頻采集設備都選用了比較先進的WDM采集卡,它將一個視頻流數字化,然后存儲于存儲介質上或通過網絡發(fā)送,然后使用MPEG-4壓縮方法將視頻數據進行壓縮,取得了一定的效果[1]。國內由于網絡發(fā)展的滯后,許多傳統的視頻采集和壓縮技術存在諸多的局限性,無法很好地應用于當前的網絡視頻監(jiān)控系統[2]。針對這一現狀,本文提出了一個基于DirectShow技術和H.264技術的視頻采集與壓縮方案。DirectShow技術與硬件無關,它以組件對象模型為基礎,使用簡單,易于維護,具有良好的可擴展性,在實際應用中取得了滿意的效果。
DirectShow是微軟公司在ActiveMovie和Video for Windows的基礎上推出的新一代基于COM的流媒體處理的開發(fā)包,與DirectX開發(fā)包一起發(fā)布。DirectShow為多媒體流的捕捉和回放提供了強有力的支持。它廣泛地支持各種媒體格式,包括Asf、Mpeg、Avi、Dv、Mp3、Wave等等,使得多媒體數據的回放變得輕而易舉。另外,DirectShow還集成了DirectX其它部分(比如DirectDraw、DirectSound)的技術,直接支持DVD的播放、視頻的非線性編輯以及與數字攝像機的數據交換。運用DirectShow,可以很方便地從支持WDM驅動模型的采集卡上捕獲數據,并且進行相應的后期處理乃至存儲到文件中[3]。這樣使在多媒體數據庫管理系統中多媒體數據的存取變得更加方便。
DirectShow使用模塊化的架構,如圖l所示,系統中參與各功能的數據處理模塊即COM組件叫做過濾器(Filter)。由過濾器圖表(Filter Graph)的模型進行管理,各個Filter在Filter Graph中按一定的順序連接成一條“流水線”協同工作。按照功能,過濾器大致分為3類:源過濾器(Source Filter)、變換過濾器(Transform Filter)和渲染過濾器(Rendering Filter),源過濾器是主要負責從外部設備獲取原始數據并作簡單處理,再將數據往下一級過濾器送。視頻采集系統就是利用源過濾器從硬件設備采集視頻數據;變換過濾器是整個過濾器圖的核心,負責數據格式的轉換、傳輸;渲染過濾器主要負責數據的最終去向,將經過處理的數據流提交給外部沒備,這里說的外部設備包括文件系統、顯示卡、聲卡、網卡等[4]。
圖1 DirectShow系統結構圖
視頻采集系統的整體框架如圖2所示,大致分為軟件和硬件兩部分。
軟件部分處于用戶模式,主要包括源過濾器、轉換過濾器和渲染過濾器3部分。DirectShow的基本原理是多媒體數據在過濾器圖表中流動,通過過濾器圖表中各過濾器實現在功能,最終實現多媒體數據在渲染過濾器中的顯示和回放。
硬件部分處于內核模式,主要包括視頻采集攝像頭和視頻顯卡設備。攝像頭支持WMD和VFW驅動模型,DirectShow使用WDM Video Capture Filter支持WDM卡,選擇視頻輸入端口,通過COM接口LAMCrossbar、LAMStreamConfig和LAMVideoProcAmmp來實現對采集輸出圖像格式、對比度.亮度、色調、飽和度等參數進行設置[5]。
圖2 視頻采集系統框圖
創(chuàng)建接口變量:
IGraphBuilder*pGraph;//過濾圖表管理器
IBaseFilter*pCap;//Video Capture Filter
IBaseFilter*pSmartTee;//Smart Tee Filter
IBaseFilter*pRender;//Video Renderer
FilterIMediaControl*pControl;//用戶命令接口,控制過濾器圖表
IMediaEvent*pEvent;過濾器圖表事件接口
下面通過系統枚舉來創(chuàng)建采集filter,關鍵代碼為:
hr=CoCreateInstance(CLSID_SystemDeviceEnum,NULL,CLSCTX_INPROC_SERVER,IID_ICreateDevEnum,(LPVOID*)&pDevEnum);
//創(chuàng)建系統枚舉COM對象
hr=pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEnum,0);
//指定枚舉類型目錄,獲得IEnumMoniker接口
if(hr==S_OK)
{IMoniker*pMoniker=NULL;}
if(pEnum->Next(1,&pMoniker,NULL)==S_OK)
//假設系統中只有—個采集設備,故枚舉到的第一個設備就是符合我們要求的采集設備
{hr=pMoniker->BindToObject(0,0,IID_IBaseFilter,(void**)&m_pCapture);}
//創(chuàng)建采集Filter
枚舉到采集設備后,將其加入到Filter Graph中去。代碼如下:hr=m_pIGraphBuilder->AddFilter(m_pCapture,L”CaptureFilter”);
通過用戶命令接口,可以完成開始、暫停、停止視頻的采集。
pControl->Run();
pControl->Stop();
因此,相比于傳統的視頻監(jiān)控系統中使用VFW實現視頻數據的采集,本系統采用DirectShow中的WDM方式實現視頻的捕捉,解決了VFW需手工操作原始數據而容易造成錯誤的弊端,直接把采集的視頻流從采集設備送到顯示設備,減少了到用戶模式的切換時間,保證了視頻圖像質量的連續(xù)性和實時性。
如果采集到的視頻數據不經過壓縮而直接保存,那么最后的尺寸將是很大的。所以通常應該先對視頻內容進行壓縮,然后再保存到文件中去。采用H.264視頻編碼標準對數據進行壓縮,H.264軟件包括encoder編碼和decoder解碼兩個程序。將采集到的視頻數據傳輸到H.264編碼器進行編碼,當數據到達解碼器時,數據就是在解碼器中完成數據的壓縮,最后再把數據流傳給客戶端。H.264編碼器算法結構的主要框架為首先通過int32_t T264_encode(T264_t*t,uints_t*sre,uints_t*dst,int32_tdst_size)函數進入編碼程序,然后調用函數encode_one_frame()進行視頻序列中每一幀的編碼;接著調用函數H264_encode_frame()對每一幀中的每一個象素進行編碼;并判斷每次編完碼后的返回值,返回值可以為EOS、SOP和SOS,分別表示當前幀是一個視頻序列的結束幀、一幅圖像的開始和一個視頻序列的開始。當判斷到該幀是一個序列的結束幀時,說明解碼結束;不是EOS的話,則循環(huán)解碼,直到解碼結束為止。這個循環(huán)是算法的主循環(huán)流程[6]。流程圖如圖3所示:
因此,相比于傳統視頻監(jiān)控系統中的視頻壓縮方式,本系統中采用的H.264壓縮技術在壓縮效率上明顯高很多。比如在同等視頻質量的壓縮下,H.264的壓縮比是MPEG2的兩倍,是MPEG4的1.5倍。另外,H.264還具有很好的IP和無線網絡信道的適應性,因此在數字視頻通信和存儲領域得到越來越廣泛地應用。
圖3 H.264編碼流程
DirectShow技術和H.264技術在視頻監(jiān)控數據的采集與壓縮中的應用證明,這些新技術的應用使該監(jiān)控系統相比于傳統的視頻監(jiān)控系統在圖像質量、壓縮效率、網絡適應性等方面有了很大的提高,取得了良好的效果。
[1]蔡安妮,孫景鰲.多媒體通信技術基礎[M].北京:電子工業(yè)出版社,2001:12.
[2]Rogerson D.COM技術內幕——微軟組件對象模型[M].北京:清華大學出版社,1999:15.
[3]陸其明.DirectShow開發(fā)指南[M].北京:清華大學出版社,2003:23-24.
[4]潘愛民.COM原理和應用[M].北京:清華大學出版社,1999:62.
[5]Microsoft Corporation.MSDN[EB/OL].http://msdn.microsoft.com/library/default.asp,2004-06-24.
[6]Microsoft Corporation.MicrosoftDirectX9.0 SDK Document[M].Redmond :Microsoft Corporation,2003:50-51.