DirectShow流媒體資料的採集及圖片的捕獲

來源:互聯網
上載者:User
流媒體的處理,以其複雜性和技術性,一向廣受工業界的關注。特別伴隨著網際網路的普及,流媒體在網路上已廣泛應用﹐怎樣使流媒體的處理變得簡單而富有成效逐漸成為了焦點問題。選擇一種合適的應用方案,將事半功倍。此時,微軟的DirectShow給了我們一個不錯的選擇。

  DirectShow是微軟公司在ActiveMovie和Video for Windows的基礎上推出的新一代基於COM的流ApsaraVideo for Media Processing的開發包,與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系統之上,我們看到的,即是我們的應用程式(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來使用網路攝影機,一般要求網路攝影機的驅動是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 過濾器串連到別的過濾器之前你必須配置它。然後查詢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的技術將有重要的實用意義。

相關關鍵詞:
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.