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