摘要:隨著計算機技術和視頻編碼技術的發展,現在DV攝像機已越來越多地進入了大眾生活,特別是在教育教學中得到了廣泛的應用,迫切需要把DV攝像機中的DV數據采集到計算機中進行瀏覽和處理,為此,筆者在Visual C++ 6.0環境下,運用DirectShow編程技術,編寫了一個DV視頻實時采集系統,可以實現DV視頻的回放和數據的采集,具有良好的實時性、可擴展性。
關鍵詞:DV;DirectShow;AVI
中圖分類號:TP37文獻標識碼:A文章編號:1009-3044(2009)24-6768-03
Realization of Real-time Digital Video Collecting System Based on DirectShow
XUE Yong
(Information and Technology Education Center, Jiangsu Teachers University of Technology, Changzhou 213001, China)
Abstract: With the development of computer technology and video encoding technology, DV vidicons have been more and more popular in people's daily lives; therefore, it is urgent that the DV data be transferred from DV vidicons to the computer to be browed and processed. For this reason, a real-time DV video collecting system is to be built with DirectShow under Visual C++ 6.0, whose purpose is to realize DV playback and data collecting. The system has a good characteristic of being real time and extendable.
Key words: DV; DirectShow; AVI
1 DV技術綜述
DV(Digital Video)是一種專門用來在專用盒式錄像帶上記錄和播放數字視頻的壓縮格式標準,它是由日本索尼,松下十多個國際性大公司于1996年聯合推出,并由國際電信聯盟(ITU)批準使用。對于PAL制信號來說,它采用的是4:1:1數字分量編碼系統,8bit量化的DCT幀內壓縮格式,固定的5:1壓縮比,記錄碼率是25Mb/s,信噪比可達54D。對于音頻也提供了優質的PCM數碼錄音技術。用戶可在雙聲道48kHz取樣、16bit量化的DAT音質和四聲道、32kHz取樣、12bit量化的FM音質兩者中進行選擇。音頻動態范圍大于85dB。經過性能檢測,DV產品的信號質量遠遠超過了S_VHS、Hi8,甚至達到專業廣播級的水平。
目前廣為流行的DV攝像機就是以這種格式記錄視頻數據的,這種基于DV技術開發的攝錄編設備,以數字化、輕便、易學易用、圖像質量高、性價比高等優點成為攝錄設備的主導產品。并且越來越多地運用到教育教學活動中,許多教師用他來模擬微格教學,實施技能訓練教學、課堂情景化教學、行為化教學、課外輔導等。此外,DV機還可以與閉路電視系統、計算機、多媒體等現代教學媒體聯用,并大大延伸他們的功能。
視頻采集是DirectShow除了媒體回放以外的又一基本功能,Filter、COM接口屏蔽了我們對硬件的訪問和復雜的采集過程,使用DirectShow SDK快速構建視頻捕獲應用程序,實現視頻的采集和圖像的捕獲。我們采集視頻的目的,一方面直接存盤為一個視頻文件;另一方面期望以圖像幀的方式,采集RGB/YUV格式數據,對數據做直接處理:濾波、編碼、識別等。
2 DirectShow簡介
DirectShow是DirectX 9.0大家族中的一位成員,它是Microsoft為Windows平臺上處理各種格式媒體文件的播放、音視頻采集等高性能要求的多媒體應用提供的完整的解決方案。開發多媒體應用要面臨很多問題,例如:如何保證多媒體數據處理的高效性;如何讓音頻和視頻同步;如何用簡單的方法處理復雜的媒體問題(包括本地文件、計算機網絡、廣播電視以及其它一些數碼電子類產品等);如何處理各種各樣的媒體格式問題(包括AVI、ASF、MPEG、MOV等);如何支持目標系統中不可預知的硬件。DirectShow設計的初衷就是盡量讓應用程序開發者從復雜的解決數據傳輸、硬件差異、同步性等問題的工作中解脫出來,總體的應用框架和底層工作由DirectShow來完成,而讓開發者把精力專注于具體的多媒體數據的處理上[1]。
DiredtShow是一個開放性的應用框架,在此框架下,只要遵循COM技術的開發規范,便可以開發出具有各種功能的多媒體應用系統。DirectShow使用一種叫Filter Graph的模型來管理整個數據流的處理過程,參與數據處理的各個功能模塊叫做Filter,各個Filte在Filter Graph中按照一定的順序連成一條“流水線”,協同工作。Filter僅僅是一種功能上的聚合,而Filter Graph就是按照一定的規律將各種Filter結合起來,并且能夠實現一定的功能,從軟件開發的角度來說,進行DirectShow應用系統從低到高分為三個層次,最低層次是各種不同功能的Filter,中間層是管理著各個Filter組合與動作的Filter Graph,而最高層則是應用程序,也就是最終用戶開發的應用程序是通過管理Filter Graph來協調整個系統中封裝為Filter的各個功能模塊的運作。
DirectShow9.0對數碼攝像機有很好的支持,DV機通過1394接口與計算機相連,支持即插即用。使用DirectShow的工具軟件GraphEdit,在“Video Capture Sources”目錄下看到一個名為“Microsoft DV Camera and VCR”的Filter,即代表DV機。除了DV機Filter外,DirectShow還提供了一系列相關的Filter來處理DV數據,主要有:DV Splitter(主要用于DV數據的視、音頻分離)、DV Video Decoder(負責DV的視頻解碼)、DV Video Encoder(負責將視頻數據編碼成DV格式)、DV Muxer(主要將獨立的音、視數據合成一個DV流)。
3 DV視頻的實時采集
在進行DV數據實時采集時。DV數據可以直接保存到AVI文件中。有兩種格式,一種格式(Type-1)仍然將音視頻按DV原有的交叉格式保存,另一種格式(Type-2)將DV數據的音視頻分開后再保存。兩種格式各有優缺點:Type-1可以節省CPU的使用時間,適合實時捕捉的場合;而Type-2保持了對VFW的向后兼容性。另外,數碼攝像機有兩種工作模式:攝像頭模式和磁帶模式。前者相當于一個攝像頭的功能,實時攝取音視頻內容,在把DV格式的數據保存到磁帶的同時也可以通過1394線把DV數據傳給計算機;后者相當于一個放像機,把磁帶上的內容顯示在攝像機的顯示屏的同時也通過1394線把DV數據傳給計算機。創建DV視頻實時采集程序主要要解決好以下幾個問題:1) 如何控制DV攝像機;2) 如何根據不同的應用(比如采集生成的文件類型是Type-1、Type-2或非壓縮格式)來構建不同的Filter Graph;3) 如何根據實際情況來改變視頻圖像的大小和幀率。下面來分別介紹:
1) DV攝像機的控制:
這里說的“控制”主要是指:在VCR Mode下,如何控制DV機對磁帶的一系列操作(如播放、暫停、快進、快退、停止等);在Camera Mode下,如何執行錄像的開始和停止命令。這種控制我們可以通過DV Filter上的IAMExtTransport接口來實現,下面是獲得這個接口的代碼:
HRESULT hr;
IBaseFilter * PDVCam;
IAMExtTransport * PTransport;
hr = PDVCam->QueryInterface ( IID_IAMExtTransport, (void **)PTransport);
獲得該接口后,就可以通過其接口方法put_mode來實現對DV機播放的控制,也可以通過get_mode方法來得到當前的DV機的狀態。
除了IAMExtTransport接口外,還可以利用IAMExtDevice接口來獲得DV機當前的工作模式[2]。
2) 根據不同的應用來構建不同的Filter Graph:
在編寫程序時,我們將所有Filter Graph相關的操作封裝在一個CDVCaptureGraph類里面,為了創建磁帶播放、磁帶錄像、DV采集等不同應用場合的Filter Graph,我們定義了一個枚舉數據類型DVGRAPH_TYPE,代碼如下:
enum DVGRAPH_TYPE
{
GRAPH_PREVIEW, //單純的預覽
GRAPH_DV_TO_FILE,//DV采集到Type-1文件(同時預覽)
GRAPH_DV_TO_FILE_NOPREW, //DV采集到Type-1文件(沒有預覽)
GRAPH_DV_TO_FILE_TYPE2,//DV采集到Type-2文件(同時預覽)
GRAPH_DV_TO_FILE_NOPREW_TYPE2, //DV采集到Type-2文件(沒有預覽)
};
然后對應每一種Filter Graph都有其相應的構建函數,比如Type-1文件(同時預覽),我們就用函數代碼如下HRESULT BuildDvToFileGraph_Type1(TCHAR * OutputFileName)來完成。在構建每一個具體的Filter Graph時,我們先在GraphEdit中搭建Filter Graph并進行測試,效果滿意了,然后再以GraphEdit中的Filter連接圖為模板,在應用程序中用程序代碼來搭建。將DV視頻保存為Type-1類型的AVI文件的Filter Graph如圖1所示。在搭建Filter Graph時,程序主要調用了ICaptureGraphBuilder::RenderStream接口方法,函數的實現的主要代碼如下:
m_GraphType = GRAPH_DV_TO_FILE;
HRESULT hr = S_OK;
USES_CONVERSION;
ASSERT(OutputFileName[0]);
CComPtr
CComPtr
hr=m_pCaptureGraphBuilder->SetOutputFileName(MEDIASUBTYPE_Avi,
T2W (OutputFileName), ppf, pSink);
// Routine for changing AVI Mux properties.
hr = SetAviOptions(ppf, INTERLEAVE_NONE);
// Connect interleaved stream of Microsoft DV Camera and VCR to the AVI Mux/FW
hr=m_pCaptureGraphBuilder->RenderStream(PIN_CATEGORY_CAPTURE,
MEDIATYPE_Interleaved, m_pDeviceFilter, NULL, ppf);
// Build a preview graph off of it too
hr=m_pCaptureGraphBuilder->RenderStream(PIN_CATEGORY_PREVIEW,
MEDIATYPE_Interleaved, m_pDeviceFilter, NULL, NULL);
// Remember to release all interfaces
3) 根據實際情況來實時改變視頻圖像的大小:
DV圖像的原始大小,NTSC制式為720*480,PAL制式為720*576,設置大小的方法可以通過兩種方法來實現,一是考慮各種不同的應用場合,將DV Video Decoder的屬性頁顯示出來,讓用戶直接選擇。二是通過DV Video Decoder Filter上的IIPDVDec接口來改變DV解碼后輸出圖像的大小。DV Video Decoder僅支持4種不同的輸出圖像尺寸(具體情況根據信號制式而定),我們一般通過一個枚舉變量來表示:
Enum _DVRESOLUTION{
DVRESOLUTION_FULL= 1000, // 原始大小
DVRESOLUTION_HALF=1001,// 寬高都縮小一半
DVRESOLUTION_QUARTER=1002, // 寬高都縮小為1/4
DVRESOLUTION_DC=1003 // 寬88,高縮小為1/8
};
此時我們可以設置一個變量dvResolution,然后根據欲設置的圖像尺寸,取出上面四個尺寸中的一個值賦予dvResolution,接著就可以調用IIPDVDec接口中的put_IPDisplay方法來設置圖像大小,主要代碼如下:
IBaseFilter * pFilter = mDVVideoDecoder->GetFilter();
if(pFilter)
{ IIPDVDec * pIPDVDec = NULL; // 在DV Video Decoder上獲得IIPDVDec接口
pFilter->QueryInterface(IID_IIPDVDec,(void**)pIPDVDec);
if(pIPDVDec)
{ pIPDVDec->Release();
pIPDVDec->put_IPDisplay(dvReaolution);}}
4 結束語
試驗結果表明,運用DirectShow技術來開發的DV視頻采集系統,抓取幀的質量高,速度快,并且具有更大的靈活性、更好的可移植性和更高的穩定性,并且開發調試更為簡便,明顯縮短了開發周期。
參考文獻:
[1] 陸其明.DirectShow開發指南[M].北京:清華大學出版社,2003:1-3.
[2] 劉祎瑋.Visual C++視頻/音頻開發實用工程案例精選[M].北京:人民郵電出版社,2004:319-320.
[3] 陸其明.DirectShow務實精選[M].北京:科學出版社,2004:117.