DirectShow流媒體消息獲得及圖象轉換.



概述

  流媒體的處理,以其混雜性和技巧性,始終廣受工業界的關懷。尤其追隨着因特網的普及,流媒體在網絡上已普遍利用﹐怎樣使流媒體的處理變得容易而富有收獲逐漸成為了焦點問題。抉擇一種輕便的利用計划,將事半功倍。此刻,微軟的DirectShow給了我們一個不錯的抉擇。

  DirectShow是微軟公司在ActiveMovie和Video for Windows的基礎上推出的新一代基於COM的流媒體處理的開發包,與DirectX開發包同時公布。現在,DirectX最新版本為9.0。DirectShow為多媒體流的捕捉和回放供給了強有力的扶持。利用DirectShow,我們能夠很得體地從扶持WDM驅動模型的采集卡上捉拿數據,並且舉行相應的后期處理乃至存儲到文件中。這么使在多媒體數據庫管教系統(MDBMS)中多媒體數據的存取變得更加得體。

  DirectShow 原理及重要的接口

  1、DirectShow工作原理

  1) DirectShow的系統構造

  DirectShow的系統構造如圖1所示。 


圖1 DirectShow系統   
  DirectShow位於利用層中。它利用一種叫Filter Graph的模型來管教全副數據流的處理過程;加入數據處理的各秉功能模塊叫Filter;各個Filter 在Filter Graph中按定然的次序連接成一條“流水線”協同工作。按照功能來分,Filter大約分為三類:Source Filters、Transform Filters和Rendering Filters。Source Filters重要負責獲得數據,數據源能夠是文件、因特網、可能計算機里的采集卡、數字攝像機等,然后將數據往下傳輸;Transform Fitlers重要負責數據的款式轉換、傳輸;Rendering Filtes重要負責數據的最后去路,我們能夠將數據送給聲卡、顯卡舉行多媒體的演示,也能夠輸出到文件舉行存儲。

  在DirectShow系統之上,我們看到cdr.riacdr.com的,即是我們的利用過程(Application)。利用過程要按照定然的願望發生起相應的Filter Graph,然后穿越Filter Graph Manager來扼制全副的數據處理過程。DirectShow能在Filter Graph運行的時候接收到各種事件,並穿越消息的措施發送到我們的利用過程。這么,就告終了利用過程與DirectShow系統之間的交互。

  2) Filter概述以及連接

  過濾器(Filter)是DirectShow中最大約的觀念。DirectShow是穿越Filter Graph來管教Filter的。Filter Graph是Filter的“容器”,而Filter是Filter Graph中的最小功能模塊。Filter是一種COM組件,對於每個Filter,都有其自己的Pin,它是由Filter創立的COM對象。Filter穿越Pin來舉行他們之間的連接。Pin分為兩種:輸出Pin和輸入Pin。輸出的Pin把Filter處理后的數據遞交到Filter的表面,而輸入Pin則是把Filter表面的數據接收到Filter中,以便Filter對這些數據舉行處理。對於三種種類的Filter(Source Filter,Transform Filter,Rendering Filter)的連接圖如下: 


圖2 Filter的連接 
  2、DirectShow對硬件的扶持原理

  大家懂得,為了長進系統的安寧性,Windows壟斷系統對硬件壟斷舉行了隔絕;利用過程等閑不能直接拜會硬件。DirectShow Filter工作在用戶形式(User mode,壟斷系統特權級別為Ring 3),而硬件工作在內核形式(Kernel mode,壟斷系統特權級別為Ring 0),DirectShow處理的措施是,為這些硬件設計包裝Filter;這種Filter能夠工作在用戶形式下,表面、扼制措施跟等閑Filter一樣,而包裝Filter內部告終與硬件驅動過程的交互。這么的設計,使得編寫DirectShow利用過程的開發人員,從為扶持硬件而需做出的特異處理中解脫出來。DirectShow曾經集成的包裝Filter,包括Audio Capture Filte(qcap.dll)、VfW Capture Filter(qcap.dll,Filter的Class Id為CLSID_VfwCapture)、TV Tuner Filter(KSTVTune.ax,Filter的Class Id為CLSID_CTVTunerFilter)、Analog Video Crossbar Filter(ksxbar.ax)、TV Audio Filter(Filter的Class Id為CLSID_TVAudioFilter)等;另外,DirectShow為批准WDM驅動過程的硬件設計了KsProxy Filter(Ksproxy.ax,)。下圖即便各個包裝Filter與硬件交互的構造圖: 

利用過程 DirectShow Filter Graph KsTune.ax KsXbar.ax KsCap.ax 其他等閑的Filter Stream Class Tuner minidriver Crossbar mindriver Capture minidriver Tuner,Crossbar,Capture minidriver


  3、DirectShow 的重要接口

  DirectShow批准了COM規范,因而許多重要的功能都是穿越COM接口來告終。下面就羅列一些重要的DirectShow的接口。

  (1) IGraphBuilder接口

  用於構造Filter Graph的接口,發生和管教一系列的Filter,過濾和處理源媒體流。

  (2) IMediaControl接口

  用於扼制多媒體流在過濾器圖表中的流動,如流的啟用和靜止。

  (3) IMediaEvent接口

  用於捉拿播送過程中發生的事件,並通知利用過程,如EC_COMPLETE等。

  (4) IVideoWindow接口

  用於扼制視頻窗口的屬性。

  (5) IMeadiaSeeking接口

  用於查找媒體的接口,定位流媒體,扼制多媒體數據播送供給准確扼制。

  (6) IBaseFilter接口

  從ImediaFilter接口繼承,用來定義一個翔實的過濾器指針,並對多媒體數據舉行處理。

  (7) IPin接口

  用於管教兩個過濾器之間的Pin,從而連接過濾器。

  (8) IsampleGrabberCB接口

  是Sample Grabber過濾器的一個接口,用於當流媒體數據穿越過濾器時舉行采樣以獲得幀圖象。

DirectShow流媒體數據的采集及圖片的捉拿

  用DirectShow來利用攝像頭,等閑要求攝像頭的驅動是WDM款式的,當然,一些比擬老的驅動款式DirectShow也可扶持。在DirectShow中,有一個Sample Grabber過濾器,它是一個能夠被插入流的過濾器,它有自己的緩沖,儲藏采樣。我們就能夠用它來從一個視頻文件中容易的撲獲一楨。DirectShow穿越圖形過濾管教器(Filter Graph Manager)來與上層利用過程和基層的驅動舉行聯系。DirectShow穿越捉拿過濾器(Capture Filter)來扶持對攝像頭的捉拿,一個捉拿過濾器有多個插口(pin),其中的預覽(preview)插口可用來舉行揭示禎圖象。

  1、創立圖形過濾管教器Filter Graph

  如上面原理所述,率先要創立Filter Graph:

CComPtr< IGraphBuilder > m_pGraph; 
hr=m_pGraph.CoCreateInstance( CLSID_FilterGraph ); 
  2、連接裝備

  還要創立系統枚舉器組件對象:

CComPtr<ICreateDevEnum>pCreateDevEnum;pCreateDevEnum.CoCreateInstance( CLSID_SystemDeviceEnum ); 
  然后利用接口措施CreateClassEnumerator ()為指定的Filter登記種類目錄創立一個枚舉器,並獲得IenumMoniker接口:

CComPtr< IEnumMoniker > pEm;
pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEm, 0 ); 
  隨后在調用BindToObject()爾后,能夠將裝備標識生成一個DirectShow Filter,將其加到Filter Graph中就能夠加入工作了。

CComPtr< IMoniker > pM;
CComPtr< IPropertyBag > pBag;
hr=pM->BindToStorage(0,0,ID_IPropertyBag, (void**) &pBag ); 
  3、創立Sample Grabber過濾器

CComPtr< ISampleGrabber > m_pGrabber
hr=m_pGrabber.CoCreateInstance( CLSID_SampleGrabber ); 
  當創立好SampleGrabber爾后,在Sample Grabber 過濾器連接到別ie.ieltsuk.org的過濾器之前你定然搭配它。然后查詢IsampleGrabber接口,還要設置流媒體種類:

m_pGrabber->SetMediaType(); 
  能夠僅僅指定主媒體種類;可能主種類加子種類;可能主種類,子種類和種類款式。然后就把它加載到FilterGraph中去:

m_pGraph->AddFilter(pGrabBase,"Grabber" ); 
  4、查找Filter Graph 的Pin並告終后續連接。

  接下來就能夠穿越調用IGraphBuilder 的FindPin()接口來查找過濾管教器中的Pin接口,並穿越ICaptureGraphBuilder2 中的接口RenderStream()來告終后續的連接。

hr=pCGB2->FindPin(pCap,PINDIR_OUTPUT,&PIN_CATEGORY_VIDEOPORT, NULL,FALSE,0,&pVPPin);
hr=pCGB2->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video, pCap,pGrabBase,pRenderer); 
  5、獲得流媒體種類並運行

  穿越GetConnectedMediaType()獲得連接流媒體的種類爾后,我們能夠穿越IsampleGrabberCB類的接口BufferCB()來把視頻的數據拷貝到自定義的緩沖區中,然后穿越在緩沖區的拷貝舉行視頻到圖象數據的拷貝。最后運行﹕

CComQIPtr<IMediaControl,&IID_IMediaControl > pControl = m_pGraph;
hr = pControl->Run( ); 
  結論

  本文談論了DirectShow的大約原理,創立Filter Graph的大約措施,以及穿越DirectShow來捉拿視頻數據,然后將其保留為自己想要的圖象,對於多媒體數據庫管教系統是一個極其利於的賠償,如對測驗報名的軟件系統有很強的習慣性,能夠減退開發成本。長進用戶的實用性。

  DirectShow技巧是一個開發多媒體的卓有收獲的措施。在未來幾年中,DirectShow技巧的進展前景相當寬闊,掌握DirectShow的技巧將有重要的實用含義。
目前,Example對象具有負值了!萬一getValues() 的調用者永遠也不設置歸來的Dimension對象的width 和height值,那么僅憑測驗是不可能檢測到這類的訛謬。 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com