前言:中文期刊網精心挑選了不正常家族關系目錄范文供你參考和學習,希望我們的參考范文能激發你的文章創作靈感,歡迎閱讀。
不正常家族關系目錄范文1
關鍵詞:流媒體;視頻采集;DirectShow;圖像處理;視頻播放
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)32-1204-04
The Capture and Process System Based on DirectX
ZHANG Hong-bing,YU Yong-yan,ZHAO Huan,SONG Bing-guang,ZHOU Mei-fang
(Huaiyin Institute of Technology, Huai'an 223002, China)
Abstract: Video capturing and processing is always a applied technology which people pay a lot attention to, it is widely used By its convenience and abundant information. this article aim at complexity and technicality of video processing, analyze the difficulty of developing Application And deeply anatomy the DirectShow application architecture, The design and implement of application of video capture and process system platform based on DirectX is Based on the development of Microsoft Visual C++ 6.0 and the kit of Microsoft DirectX SDK 9.0.and analyze develop application based on DirectShow architecture is very simple things, and this system support the different hardware, realize the many windows capture, media playback and image process.
Key words: streaming media; video processing; directShow; image processing; media play
1 引言
DirectX軟件開發包是微軟公司提供的一套在Windows操作平臺上開發高性能圖形、聲音、輸入、輸出和網絡游戲的編程接口。而作為DirectX家族的核心成員之一的DirectShow,為在Windows平臺上處得各種格式的媒體文件的回放、音視頻采集等高性能要求的多媒體應用,提供了完整的解決方案。為了使應用程序開發人員從復雜的數據傳輸、硬件差異、同步性等復雜工作中解脫出來,利用DirectShow提供的應用框架和對底層設備的支持,開發了基于DirectShow框架的多媒體應用程序。
2 技術簡介
2.1 系統架構
DirectShow系統中采用了過濾器圖表管理器(Filter Graph Manager)的模型來管理整個數據流處理過程;參與數據處理的各個功能模塊叫做過濾器 (Filter),各個過濾器在過濾器圖表中按照一定的順序連接成一條鏈路協同工作,使用過濾器圖表管理器模型來管理整個數據流的處理過程。
如圖1所示,圖中最大的一塊就是DirectShow系統,虛線以下是Ring 0特權級別的硬件設備,虛線以上是Ring 3 特權級別的應用層。DirectShow系統位于應用層中。DirectShow系統是基于組件對象模型(COM)標準的。
2.2 過濾器
過濾器(Filter)是DirectShow系統中的最基本的概念,是過濾器圖表中最小的功能模塊,DirectShow系統中將多媒體數據處理分離成不同的模塊,在不同的模塊中由不同的過濾器去處理,這樣把相關的過濾器連接在一起,以達到處理多媒體數據的要求。按照功能來分,過濾器大致分為3類:源過濾器(Source Filters)、變換過濾器(transform Filters)和渲染過濾器(Rendering Filters)。源過濾器主要負責獲取數據,源過濾器引入數據到過濾器圖表中,數據來源可以是文件系統、網絡、攝像頭等。不同的源過濾器處理不同的類型的數據源。變換過濾器的工作是獲取輸入流,處理數據,并生成輸出流。變換過濾器對序據的處理包括編解碼、格式轉換、壓縮解壓縮等。渲染過濾器在過濾器圖表里處于最后一級,負責數據的最終的去向,將數據送給顯卡、聲卡進行多媒體的演示,或者輸出到文件進行存儲。
一個過濾器至少有一個輸入端或者是輸出端,在DirectShow系統中這些端口被稱為引腳(pin),引腳是基于COM組件的,過濾器之間通過引腳相互連接,構成一條順序的鏈路。應用程序是建立在DirectShow系統之上。首先應用程序要按照所要實現的功能建立起過濾器圖表,然后借助于過濾器圖表管理器來控制整個數據處理過程。DirectShow系統能在過濾器圖運行接收到應用程序發送的各種消息事件,控制鏈路中的過濾器的運行狀態,這就實現了應用程序與DirectShow系統之間的交互。在這過程中就要用到過濾器管理器組件。過濾器圖表管理器也是一個COM對象,用來控制過濾器圖表中的所有的過濾器,主要有以下幾個功能:
1) 用來協調過濾器之間的狀態改變,從而使過濾器圖表中的所有的過濾器的狀態的改變。
2) 建立一個參考時鐘。
3) 將過濾器的消息返回給應用程序。
4) 提供方法用來建立過濾器圖表。
2.3 對硬件的支持
DirectShow解決的方法是,為這些硬件設計包裝過濾器;這種過濾器能夠工作在用戶模式下,外觀、控制方法跟普通過濾器一樣,而包裝過濾器內部完成與硬件驅動程序的交互。DirectShow系統中已經集成了許多包裝過濾器,這樣的設計可以使開發人員從支持硬件的特殊處理中解脫出來。
3 基于DirectX的多媒體處理系統――視頻采集與處理的實現
基于DirectX的多媒體處理系統――視頻采集與處理是一個實用的應用軟件系統,數據處理的整個流程就是:輸入源―>中間件―>輸出終端。完成視頻的采集以及進一步進行相關的處理,本系統包括以下幾個功能:視頻采集功能、視頻播放功能和視頻圖像的抓圖及處理功能等。下面對系統各子功能模塊進行分析。
視頻采集功能:將攝像頭捕捉到的模擬視頻信號轉換為數字視頻信號并能實現預覽功能,再通過相關的編碼器進行編碼,本系統采用了動態圖像專家組編碼器(MPEG-4 Codec, 簡寫為Xvid)編碼器,將采集到的視頻文件編碼成動態圖像專家組(Moving Pictures Experts Group, 簡寫為MPEG)格式的文件,減少了視頻文件的大小,從而節省了硬盤的空間,同時也方便了在網絡上傳輸。
視頻播放功能:可對本地系統中的視頻文件進行解碼,并進行播放,其功能和其它的視頻播放器的功能相似,如播放、暫停和全屏等。同時,本模塊在理論上可以播放任何格式的媒體文件,只要系統中安裝了相關的解碼器即可。
視頻圖像的抓圖及處理功能:可對本地系統中的圖像文件進行顯示,并能對圖像進行處理,除了實現一些經典的圖像處理算法,并能實現一些新穎的圖像處理算法。
下面根據本課題的任務,確定組成該系統的每個功能模塊的結構,然后進行該系統的結構設計,從而確定模塊組成以及這些模塊之間的動態調用關系。整個基于DirectX 的多媒體處理系統――視頻采集與處理的設計的過程,都遵循系統模塊之間獨立的原理,也就是說該系統由一組完全相對獨立的子功能模塊組成,而且這些模塊彼此之間的接口關系盡量簡單。
3.1 視頻采集的實現
在編程實現過程中,要把視頻采集設備封裝成類,用面向對象的思想來進行視頻采集模塊的詳細設計。在視頻實時采集的功能就是在程序界面上能顯示多個畫面,能對多個視頻采集設備進行操作,對每個視頻采集設備的工作都是獨立的,該系統是采用多線程的,這也是現代軟件也是必須的,換句話說每個視頻采集設備都使用一個線程,一個視頻采集設備的損壞或不正常工作,對其它的視頻采集設備均不造成影響,保證了程序的實用性和健壯性,對每個圖像顯示畫面,可以選擇視頻采集設備,要求系統能枚舉出系統中的安裝的所有視頻采集設備,可對視頻采集的畫圖的大小進行調節,通過程序能調用視頻采集設備的屬性頁,進而能對視頻采集設備進行更高一級的調整。這樣能保證了視頻采集設備所采集到的圖像畫面達到一個最佳的效果。
通常情況下視頻采集設備所采集到的模擬圖像,系統在一般情況下,采集到的視頻為音頻視頻交錯格式(Audio Video Interleaved, 簡寫為AVI)的,眾所周知,AVI格式是非壓縮的、視頻數據量非常巨大,對要求將視頻文件保存到本地系統中或傳輸給其它網絡用戶來說,這是不可能接收的,數據壓縮的問題由來已久了,在計算機剛剛發展的時候,在有限的帶寬的條件下,怎樣才能傳輸數據量大的文件時,大量的計算機專家就開始了數據壓縮方面的研究,到現在為此,有關數據壓縮方面的算法已經相當的成熟了,在視頻處理方面則出現了許多的編碼器,其實在開發過程中可以自己寫一個視頻相關的編碼器,但因為有相關的組織開發了許多相關的視頻編解碼器,且相關的視頻編解碼器的開源的,為了減輕開發的難度,同時又能達到差不多的效果,所以在本系統開發中采用第三方的編碼器,對視頻數據進行編碼,程序界面中可選擇相關的編碼器。還有一個功能就是在視頻實時采集時能對視頻圖像進行抓圖,將抓到的圖像進行保存到本地文件系統中,保存的格式為常見的位圖圖像(Bit Map Picture, 簡寫為BMP)格式。視頻采集設備必須以Filter的形式才能參與到DirectShow系統中,進而與其他Filter協同工作。采集設備的創建是實質上就是系統的枚舉過程,程序先是枚舉到系統中所有的視頻采集設備的友好名字,當用戶選定一個視頻采集設備后,就可以得到這個設備的友好名字或者顯示名字,然后就可以以這個名字為參數去創建它。具體的過濾器的連接過程,可借用微軟公司提供的GraphEdit,該工具提供了可視化的環境,大大降低了開發有關的程序的難度。
3.2 視頻播放的實現
該模塊實現了和其它相關的視頻播放器相關的功能,能對視頻進行打開和播放,能進行一些相關的基本操作,同時考慮到主要是對視頻采集設備采集到的視頻文件進行回放和處理,添加了一些與本系統相關的功能,如圖像的疊加、局部放大、嵌入字幕等,該播放器理論上能播放任何類型的文件(只要系統中注冊相關的解碼過濾器),在播放媒體文件過程中,可以通過播放界面的上按鈕或“控制”菜單下的子菜單項進行各種播放控制,包括:播放、暫停、停止、實現靜音播放、音量大小調節、聲道平衡設置、快放、慢放、全屏播放、截圖等功能。對視頻播放器的界面進行設計時,可考慮到界面的美觀、操作易用、功能完善等方面,進行該模塊設計的主要目的是添加一些與該系統相關的操作,考慮用戶的需求,盡量的實用化,做出自己的特色來,要讓用戶用到該播放器模塊時,要認可該播放器,因為用戶已經用過許多的多媒體播放器,已經習慣于自己常用的播放器的操作,制作該模塊主要在于界面的美化方面。
3.3 視頻圖像處理的實現
該模塊包含以下幾個功能:視頻圖像的載入、視頻圖像的播放和視頻圖像處理算法的實現。
近幾年來,由于計算機技術的迅猛的發展,從而使得圖像處理得以廣泛應用于眾多的科學與工程領域,這些技術正在明顯地改變著人們的生產手段和生活方式。正因為圖像處理有如此多的應用,如此與人們的生活方式息息相關,所以有必要對圖像和圖像技術進行深入細致的研究。該模塊的程序界面和一般的圖像處理軟件差不多,有一些最基本的圖像處理操作,例如:圖像的增強,圖像的復原,圖像的變換等。還要實現一些高級的圖像處理算法,如:圖像的配準,圖像的分析和特性的提取,目標和運動檢測,圖像分割和圖像的識別等。其中的算法已經實現的,參考其它的代碼來實現,對一些未實現的算法或算法表現的效果不滿意的,爭取寫出自己的程序算法,并來檢驗自己的算法效果。
4 基于DirectX的多媒體處理系統――視頻采集與處理的代碼實現與分析
4.1 硬件部分
圖像采集設備一般采用CCD攝像機加上WDM圖像采集卡或者是USB 2.0攝像頭具有穩定、支持熱插拔、采集的圖像分辨率大、性價比高等優點,而USB 2.0帶寬最大可達到480MB/s,最大支持連接的外設理論上為127個,適合較大數據量的傳輸。基于以上的優點,本系統采用了基于USB 2.0的攝像頭。
4.2 軟件的關鍵實現部分
該系統的數據采集部分實現的思想如圖2所示,用USB 攝像頭采集視頻數據,利用DirectShow提供的對視頻采集硬件的包裝過濾器,在過濾器內完成視頻數據采集功能。
過濾器圖表中加入源過濾器是通過系統枚舉的方式來實現的,在DirectShow的GraphEdit下目錄Video Capture Sources(對應的過濾器ID為:CLSID_VideoInputDevicesCategory)下找到相應的采集設備。
ICreateDevEnum * enumHardware = NULL;
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_ALL,
IID_ICreateDevEnum, (void**)&enumHardware);
//創建系統枚舉組件
hr = enumHardware->CreateClassEnumerator(inCategory, &enumMoniker, 0);//為指定目錄創建枚舉器,并獲得IEnumMoniker接口
while (!hardwareFilter && SUCCEEDED(enumMoniker-
>Next(1, &moniker, &fetched)) && fetched)
//循環枚舉采集設備
moniker->BindToObject(0, 0,
IID_IBaseFilter, (void**)&hardwareFilter);
//創建過濾器實例
枚舉到采集設備后,下一步的工作就是把它加入到過濾器圖表中,代碼如下:
mGraph->AddFilter(mFilter, mName)
為了對視頻數據壓縮和寫入文件,代碼如下:
mAviMux = new CAviMuxFilter(mGraph->GetGraph());
//創建編碼、合成、寫文件需要的過濾器
pass = mAviMux->CreateFilter();
mFileWriter = new CFileWriterFilter(mGraph->GetGraph());
pass = mFileWriter->CreateFilter();
//創建文件寫入過濾器
mFileWriter->SetDestFile(mLiveCapture->GetOutputFile());
//給文件寫入過濾器設置文件路徑
if (mLiveCapture->GetEncodingType() == ET_Xvid)
//如有必要創建編碼過濾器
{IBaseFilter* pFlt = UDsUtils::CreateCompressor(TRUE,
"Xvid MPEG-4 Codec");//v1.13
//通過枚舉Video Cpmpressors目錄來創建DivX壓縮過濾器
if (pFlt)
{
mVideoEncoder = new CDXFilter(mGraph->GetGraph());
mVideoEncoder->Attach(pFlt, "Xvid MPEG-4 Codec");
//如果成功,將壓縮過濾器加入到過濾器圖表中
}
在本系統中,能顯示出視頻采集設備的屬性頁,并能對視頻采集設備的屬性頁進行設置。核心代碼為:
ISpecifyPropertyPages * pSpecify;
HRESULT hr = inFilter->QueryInterface(IID_ISpecifyPropertyPages,
(void **)&pSpecify);
//從Filter上獲得ISpecifyPropertyPages接口
if (SUCCEEDED(hr))
CAUUID caGUID;
pSpecify->GetPages(&caGUID);
pSpecify->Release();
OleCreatePropertyFrame(::GetActiveWindow(),0,0,NULL,1,
(IUnknown **) &inFilter, caGUID.cElems,caGUID.pElems, 0, 0, NULL );
//顯示采集設備的屬性頁
CoTaskMemFree(caGUID.pElems);
//釋放資源
本系統還實現了視頻播放功能,在本功能實現過程,采用了DirectShow系統中所特有的技術,這種“自動”機制也稱為智能連接,在代碼中調用了IGraphBuilder::RenderFile函數,該函數能自動加入必要的過濾器來完成視頻文件的回放過濾器圖表的構建,并設置顯示窗口和消息窗口。核心代碼如下:
mFilterGraph->RenderFile(mSourceFile);
//處理mSourceFile并準備播放;建立一個過濾器鏈路
mFilterGraph->SetDisplayWindow(mVideoWindow.GetSafeHwnd());
mFilterGraph->SetNotifyWindow(this->GetSafeHwnd());
//設置顯示窗口和消息窗口
本系統實現了基于對話框的視頻圖像顯示,并能對視頻圖像進行處理并顯示出來,其核心代碼如下:
CClientDC ClientDC(pDCShow->GetWindow());
//得到顯示區域
m_pResMap=new CBitmap();
//新建一個CBitmap對象
m_pResMap->CreateCompatibleBitmap(&ClientDC,m_nWndWidth,m_nWndHeight);
//初始化CBitmap對象
dc.CreateCompatibleDC(&ClientDC);
//創建DC句柄
for(int i=0; i<m_nWndHeight; i++)
for(int j=0; j<m_nWndWidth; j++)
dc.SetPixelV(j,i,RGB(m_tResPixelArray[i][j].rgbRed,
m_tResPixelArray[i][j].rgbGreen,m_tResPixelArray[i][j].rgbBlue));
//對每個像素進行賦值
pDCShow->StretchBlt(0,0,m_nWndWidth,m_nWndHeight,&dc,0,0,
m_nWndWidth,m_nWndHeight,SRCCOPY);
//畫圖語句
5 結束語
在Windows平臺下,DirectShow是開發視頻采集與處理的應用程序的有效方法,本文介紹開發一種較為實用,采用基于USB攝像頭的采集設備的視頻采集方法,采用了DirectShow系統中所特有的智能連接的機制來加入必要的過濾器完成對視頻文件的回放過濾器圖表的構建和對視頻圖像進行處理。在實際運行中穩定可靠,視頻圖像清晰,可以適用于多個場合并可對其進行二次開發,以滿足特殊的需要。
參考文獻:
[1] 吳志軍,馬蘭,沈笑云.Visual C++視頻會議開發技術與實例[M].北京:人民郵電出版社,2006
[2] 高守傳,聶云銘,鄭靜.Visual C++6.0開發指南[M].北京:人民郵電出版社,2007.
[3] 戴博,周楊,龔濤,等.Visual C++程序員成長攻略[M].北京:人民水利水電出版社,2007.
[4] 楊枝靈,王開.Visual C++數字圖像獲取處理及實踐應用[M].北京:人民郵電出版社,2003.
[5] 四維科技,劉t瑋.Visual C++視頻/音頻開發實用工程案例精選[M].北京:人民郵電出版社,2004.
[6] 陸其明.DirectShow開發指南[M].北京:清華大學出版社,2003.
[7] 陸其明.DirectShow實務精選[M].北京:科學出版社,2004.
[8] 張益貞,劉滔.Visual C++實現MPEG/JPEG編解碼技術[M].北京:人民郵電出版社,2002.
[9] 求是科技.Windows API 程序設計參考大全[M].北京:人民郵電出版社,2006.
[10] 電腦編程技巧與維護. Visual C/C++圖形圖像與游戲編程典型實例解析[M].北京:中國水利水電出版社,2006.
[11] 宋輝,曲向麗,宋振龍.Visual C++實用培訓教程[M].北京:人民郵電出版社,2002.
[12] Microsoft Corporation.Microsoft DirectX 9.0 SDK Document.Microsoft Corporation,2002.
[13] Microsoft Corporation.MSDN Library Visual Studio 6.0[M].Microsoft Corporation,2001.