Directshow 捕捉視頻入門篇

這裏是對視頻捕捉設備的一些介紹

2 視頻捕捉的設備
現在許多新的視頻捕捉設備都採用的是WDM驅動方法(Windows Driver Model(WDM)的縮寫,中文意思是“視窗驅動程序模塊”,在WDM機制中,微軟提供了一個獨立於硬件設備的驅動,稱爲類驅動程序。驅動程序的供應商提供的驅動程序稱爲minidrivers。Minidrivers提供了直接和硬件打交道的函數,在這些函數中調用了類驅動。
在directshow的filter圖表中,任何一個WDM捕捉設備都是做爲一個WDM Video Capture過濾器(Filter)出現。WDM Video Capture過濾器根據驅動程序的特徵構建自己的filter

 

下面是陸其明的一篇有關於dshow和硬件的文章,可以拿來參考一下,很有價值

//陸文章開始

大家知道,爲了提高系統的穩定性,Windows操作系統對硬件操作進行了隔離;應用程序一般不能直接訪問硬件。DirectShow Filter工作在用戶模式(User mode,操作系統特權級別爲Ring 3),而硬件工作在內核模式(Kernel mode,操作系統特權級別爲Ring 0),那麼它們之間怎麼協同工作呢?

DirectShow解決的方法是,爲這些硬件設計包裝Filter;這種Filter能夠工作在用戶模式下,外觀、控制方法跟普通Filter一樣,而包裝Filter內部完成與硬件驅動程序的交互。這樣的設計,使得編寫DirectShow應用程序的開發人員,從爲支持硬件而需做出的特殊處理中解脫出來。DirectShow已經集成的包裝Filter,包括Audio Capture Filter(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,)

Ksproxy.ax、Kstune.ax、Ksxbar.ax這些包裝Filter跟其它普通的DirectShow Filter處於同一個級別,可以協同工作;用戶模式下的Filter通過Stream Class控制硬件的驅動程序minidriver(由硬件廠商提供的實現對硬件控制功能的DLL);Stream Class和minidriver一起向上層提供系統底層級別的服務。值得注意的是,這裏的Stream Class是一種驅動模型,它負責調用硬件的minidriver;另外,Stream Class的功能還在於協調minidriver之間的工作,使得一些數據可以直接在Kernel mode下從一個硬件傳輸到另一個硬件(或同一個硬件上的不同功能模塊),提高了系統的工作效率。(更多的關於底層驅動程序的細節,請讀者參閱Windows DDK。)

下面,我們分別來看一下幾種常見的硬件。


(1)VfW視頻採集卡VFW(Video for Windows)

這類硬件在市場上已經處於一種淘汰的趨勢;新生產的視頻採集卡一般採用WDM驅動模型。但是,DirectShow爲了保持向後兼容,還是專門提供了一個包裝Filter支持這種硬件。和其他硬件的包裝Filter一樣,這種包裝Filter的創建不是像普通Filter一樣使用CoCreateInstance,而要通過系統枚舉,然後BindToObject。

 

 

(2)音頻採集卡(聲卡)。

聲卡的採集功能也是通過包裝Filter來實現的;而且現在的聲卡大部分都有混音的功能。這個Filter一般有幾個Input pin,每個pin都代表一個輸入,如Line In、Microphone、CD、MIDI等。值得注意的是,這些pin代表的是聲卡上的物理輸入端子,在Filter Graph中是永遠不會連接到其他Filter上的。聲卡的輸出功能,可以有兩個Filter供選擇:DirectSound Renderer Filter和Audio Renderer (WaveOut) Filter。注意,這兩個Filter不是上述意義上的包裝Filter,它們能夠同硬件交互,是因爲它們使用了API函數:前者使用了DirectSound API,後者使用了waveOut API。這兩個Filter的區別,還在於後者輸出音頻的同時不支持混音。(順便說明一下,Video Renderer Filter能夠訪問顯卡,也是因爲使用了GDI、DirectDraw或Direct3D API。)如果你的機器上有聲卡的話,你可以通過GraphEdit,在Audio Capture Sources目錄下看到這個聲卡的包裝Filter。

 

(3)WDM驅動的硬件(包括視頻捕捉卡、硬件解壓卡等)。

這類硬件都使用Ksproxy.ax這個包裝Filter。Ksproxy.ax實現了很多功能,所以有“瑞士軍刀”的美譽;它還被稱作爲“變色龍Filter”,因爲該Filter上定義了統一的接口,而接口的實現因具體的硬件驅動程序而異。在Filter Graph中,Ksproxy Filter顯示的名字爲硬件的Friendly name(一般在驅動程序的.inf文件中定義)。我們可以通過GraphEdit,在WDM Streaming開頭的目錄中找到本機系統中安裝的WDM硬件。因爲KsProxy.ax能夠代表各種WDM的音視頻設備,所以這個包裝Filter的工作流程有點複雜。這個Filter不會預先知道要代表哪種類型的設備,它必須首先訪問驅動程序的屬性集,然後動態配置Filter上應該實現的接口。當Ksproxy Filter上的接口方法被應用程序或其他Filter調用時,它會將調用方法以及參數傳遞給驅動程序,由驅動程序最終完成指定功能。除此以外,WDM硬件還支持內核流(Kernel Streaming),即內核模式下的數據傳輸,而無需經過到用戶模式的轉換。因爲內核模式與用戶模式之間的相互轉換,需要花費很大的計算量。如果使用內核流,不僅可以避免大量的計算,還避免了內核數據與主機內存之間的拷貝過程。在這種情況下,用戶模式的Filter Graph中,即使pin之間是連接的,也不會有實際的數據流動。典型的情況,如帶有Video Port Pin的視頻捕捉卡,Preview時顯示的圖像就是在內核模式下直接傳送到顯卡的顯存的。所以,你也休想在VP Pin後面截獲數據流。

講到這裏,我想大家應該對DirectShow對硬件的支持問題有了一個總體的認識。對於應用程序開發人員來說,這方面的內容不用研究得太透,而只需作爲背景知識瞭解一下就好了。其實,大量繁瑣的工作DirectShow已經幫我們做好了。
//陸其明文章結束


Direcshow中視頻捕捉的Filter Pin的種類


捕捉Filter一般都有兩個或多個輸出pin,他們輸出的媒體類型都一樣,比如預覽pin和捕捉pin,因此根據媒體類型就不能很好的區別這些pin。此時就要根據pin的功能來區別每個pin了,每個pin都有一個GUID,稱爲pin的種類
如果想仔細的瞭解pin的種類,請看後面的相關內容Working with Pin Categories。對於大多數的應用來說,ICaptureGraphBuilder2提供了一些函數可以自動確定pin的種類。

預覽pin和捕捉pin


視頻捕捉Filter都提供了預覽和捕捉的輸出pin,預覽pin用來將視頻流在屏幕上顯示,捕捉pin用來將視頻流寫入文件。


預覽pin和輸出pin有下面的區別
1 爲了保證捕捉pin對視頻楨流量,預覽pin必要的時候可以停止。
2 經過捕捉pin的視頻楨都有時間戳,但是預覽pin的視頻流沒有時間戳。


預覽pin的視頻流之所以沒有時間戳的原因在於filter圖表管理器在視頻流里加一個很小的latency,如果捕捉時間被認爲就是render時間的話,視頻renderFilter就認爲視頻流有一個小小的延遲,如果此時render filter試圖連續播放的時候,就會丟楨。去掉時間戳就保證了視頻楨來了就可以播放,不用等待,也不丟楨。


預覽pin的種類GUID爲PIN_CATEGORY_PREVIEW


捕捉pin的種類GUID爲PIN_CATEGORY_CAPTURE


Video Port pin
Video Port是一個介於視頻設備(TV)和視頻卡之間的硬件設備。同過Video Port,視頻數據可以直接發送到圖像卡上,通過硬件的覆蓋,視頻可以直接在屏幕顯示出來。Video Port就是連接兩個設備的。
使用Video Port的最大好處是,不用CPU的任何工作,視頻流直接寫入內存中。
如果捕捉設備使用了Video Port,捕捉Filter就用一個video port pin代替預覽pin。


video port pin的種類GUID爲PIN_CATEGORY_VIDEOPORT


一個捕捉filter至少有一個Capture pin,另外,它可能有一個預覽pin 和一個video port pin,或者兩者都沒有,也許filter有很多的capture pin,和預覽pin,每一個pin都代表一種媒體類型,因此一個filter可以有一個視頻capture pin,視頻預覽pin,音頻捕捉pin,音頻預覽pin。


Upstream WDM Filters
在捕捉Filter之上,WDM設備可能需要額外的filters,下面就是這些filter
TV Tuner Filter
TV Audio Filter.


Analog Video Crossbar Filter
儘管這些都是一些獨立的filter,但是他們可能代表的是同一個硬件設備,每個filter都控制設備的不同函數,這些filter通過pin連接起來,但是在pin中沒有數據流動。因此,這些pin 的連接和媒體類型無關。他們使用一個GUID值來定義一個給定設備的minidriver,例如:TV tuner Filter 和video capture filter都支持同一種medium。
在實際應用中,如果你使用ICaptureGraphBuilder2來創建你的capture graphs,這些filters就會自動被添加到你的graph中。更多的詳細資料,可以參考WDM Class Driver Filters。


未完,待續。。。。。哈哈,如有問題可以聯繫我:QQ:1906733710,我是從事電子簽到軟件、電子白板、互動投影軟件、查詢軟件開發的,現在要開發視頻錄製的功能,在對Directshow 研究的過程當中。希望一起研究提高。有需要軟件的也可以聯繫我。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章