WDM 視頻捕獲介紹
-孫 濤-
摘要:該文主要提供一些在Win98,win2K及以上操作系統中,進行Windows Driver Model(WDM)視頻捕獲的相關知識介紹。如果你對WDM視頻捕獲感興趣,可以來看看這些東西。歡迎到我的博客blog.csdn.net/suntaoznz看其他文章!
目 錄
Windos下視頻捕獲簡史
WDM和視頻捕獲
VfWWDM Mapper
WDM 視頻捕獲結構
DirectShow應用程序
DirectShow Filter Graph
WDM數據流
視頻捕獲 Minidrivers
Pins, Streams, Formats
視頻流命名約定
DirectShow 視頻捕獲的接口和屬性
捕獲數據流類型
流輸出數據格式
結束語
Windos下視頻捕獲簡史
VFW(Video For Windows)1.0版本在1992年11月發佈,它是爲在Windows3.1下將電影最優化地捕獲到磁盤上而發佈的。從那以後,視頻捕獲技術就越來越受到關注了。
VFW技術同樣受到了很多批評,它捕獲的數據保存到磁盤上會佔用大量磁盤空間,每秒數據量超過20M,同時需要大量的客戶端支撐軟件,VFW體系架構上的不足在視頻會議應用上和PC/TV應用上被暴露無遺,這樣就要求一種新的視頻捕獲技術來彌補這些不足。
VFW的體系結構缺乏爲視頻會議,電視瀏覽,視頻區域捕獲和VBI(Vertical Blanking Interval)數據流提供強而有效的支持。一些視頻卡等設備開發商在設計自己的產品時,針對這些缺陷,對VFW進行了功能擴展。由於沒有統一的標準,我們的應用程序在使用這些擴充的功能時,就必須要寫一些基於特定硬件的代碼。這就意味着當要改變捕獲驅動程序時,就必須要對顯卡的驅動程序進行修改。
WDM和視頻捕獲
WDM 視頻捕獲設計就是爲了來解決VFW體系結構中存在的這些問題。WDM視頻捕獲主要的好處體現在:
l 可以爲設備(如基於USB,IEEE 1394通訊方式的攝像頭 )提供32位的驅動程序。
l 允許DirectShow 和 WDM 流協同工作。
l 可以在視頻捕獲設備和DVD/MPEG設備間,爲硬件(如video ports 和 chip sets)共享一個分類的驅動程序結構(Stream.sys)。
l 支持多個數據流。
l 允許電視信號調頻和輸入選擇。
l 支持視頻區域捕獲,區域顯示和VBI。
l 允許使用DirectDraw® VPE (Video Port Extensions)管理視頻輸入。
在一個單獨設備上可能會有多個組件共存的情況,這些組件包括DVD解碼器,MPEG解碼器,視頻解碼器,調諧器,音頻解碼器。WDM數據流就是用於解決這種情況而創建的。它是個統一的驅動模型,可以支持所有的這些設備和去處理它們的資源分配。
WDM數據流爲標準數據類型和用戶自定義數據類型提供了統一的數據模型,同樣,它定義了大部分的標準設備的屬性,並且根據需要可以很容易地實現擴充。因爲按WDM數據流的協議,它支持在設備內核間進行數據傳輸,而不需要在用戶模式下進行數據轉換。這樣可以獲得較高的效率,減少不必要的工作。
操作系統仍然支持VfW驅動程序,但是依賴於VFW的開發將逐漸減少,這是因爲下面三個原因:
l WDM數據流爲基於電視瀏覽和視頻會議的捕獲設備提供了優化支持。
l DirectShow提供了更強的功能。
l Microsoft 將不會對VFW進行持續開發。
VfWWDM Mapper
VfWWDM mapper是Windows 98 和 Windows 2000 操作系統的一部分。它提供了WDM 驅動程序到基於VfW程序的向後兼容。對於Windows 98, 有一個驅動程序文件和一個動態鏈接庫Vfwwdm.drv 和 Vfwwdm32.dll。Windows 2000只要求一個DLL文件。典型的 mapper應用於顯示視頻捕獲設備對話框、視頻源選擇對話框、攝像頭控制面板和視頻格式設置。
VfWWDM mapper 不是全面兼容並且不支持舊VFW的所有功能。例如不支持視頻覆蓋,也不支持視頻端口implementations 。
WDM 視頻捕獲結構
WDM 視頻捕獲結構圖如下:
DirectShow應用程序
DirectShow 用於控制多媒體數據流;它可以在運行時允許用戶播放數字電影和對不同格式的聲音進行解碼,包括MPEG-1。
這種播放性能可以讓音視頻卡支持Microsoft DirectX®的API,DirectShow 同樣可以播放AVI電影文件和Apple QuickTime (.mov)格式文件。
DirectShow 被廣泛地應用於Windows 95, Windows 98, 和Windows 2000應用程序。DirectShow 直接和驅動程序通訊,DirectShow 不使用AVICap, 因爲AVICap分配了數據緩衝區,如果一個DirectShow 層沒有放在AVICap 頂層,那麼緩存區數據必須要通過轉化去指向它,這樣會造成效率地下。
DirectShow Filter Graph
DirectShow結構定義了標準的組件去控制處理帶時間標記(time-stamped)的多媒體數據流,這些組件被稱爲過濾器(Filter)。把這些Filter放在一個容器中,這個容器就是Filter Graph。可能有三種類型的Filter:Source ,transform 和render。(注:有些資料將Filter翻譯爲過濾器,FilterGraph翻譯爲過濾器圖表,這裏我都用原單詞)
應用程序可以通過Filter Graph管理器來進行數據訪問。Filter Graph 管理器會對Filter Graph配置進行管理,同時還會通過Filter Graph控制數據的轉移。Filter Graph 管理器提供了一套COM接口,去允許應用程序與Filter Graph實現通訊。
應用程序可以直接調用Filter Graph管理器接口去控制媒體流或者去獲得Filter事件。還可以使用DirectShow ActiveX的OCX控件進行程序設計。,還有一套MCI子集命令可以用來向後兼容Microsoft VFW 1.x版本和遵循OM-1 MPEG MCI 規範。
WDM數據流
WDM數據流主要應用包括視頻捕獲,電視瀏覽,VBI數據編碼支持和DVD電影播放。DirectShow可以非常容易地使用這些數據。
視頻捕獲 Minidrivers
視頻卡由一些組件構成,比如電視信號調諧器,AM/FM調諧器,視頻解碼器,音頻解碼器等,它們都由WDM Minidriver控制。使用Minidrivers ,就可以允許硬件開發商爲不同的卡開發器驅動程序,他們只需要把Minidriver寫到他們的卡上,當硬件設計修改後,不需要對修改驅動做更多的修改。
在Windows 98 和Windows 2000下,視頻設備使用WDM 的Minidriver去控制視頻數據流,視頻捕獲 Minidrivers 相當與一個客戶端,它會去控制處理硬件設備的圖像數據和其他相關數據。Minidrivers提供瞭如下的功能:
- 捕獲壓縮和非壓縮的視頻數據流,VBI數據,時間編碼和其他輔助數據流。
- 控制視頻流相關設備,比如電視信號調諧器,視頻路由設備,電視音頻控制器和視頻壓縮編碼器。
- 在流內核中完成處理工作,減少操作過程提高效率。
Pins, Streams, Formats
數據流視頻捕獲驅動程序可以同時支持多個壓縮數據,非壓縮數據,時間編碼, VBI解碼數據以及自定義數據。爲了保證每種數據同步匹配,捕獲驅動程序爲這些數據創建了一個新的數據流。每個流都會用一個WDM流針腳(Pin)來傳遞,通過針腳,單個數據流就可以把它的數據連接到不同的流Filter中去,還可以通過DirectShow 用戶Filter的輸出針腳,把數據轉換輸出給用戶。(前面我們提到Filter的3種類型:Source ,transform 和render。Source只有輸出針腳,而transform有輸入、輸出2個針腳,render只有輸入針腳)
每個針腳都可以支持多種不同的數據格式。比如,一個針腳它可以提供RGB16, RGB24, YVU9, 和 JPEG 數字視頻。針腳可以連接到一個共享的系統內存的數據緩存區,它還可以直接連接到硬件設備。
視頻流命名約定
通常,DirectShow 和 WDM 流會共享媒體的格式定義和流命名約定。但是基於內核模式(Kernel-mode)和用戶模式(User-mode)下的命名約定有一些小的命名差異。比如,內核模式下的很多格式定義和GUID定義會在名稱前加個”KS”前綴,BITMAPINFOHEADER就是用戶模式下的定義,而KS_BITMAPINFOHEADER就是內核模式下的相同結構的定義。
在內核模式下,流格式使用KSDATAFORMAT數據結構。這個結構可以被擴展去包含其它特別的數據格式信息。
typedef union {
struct {
ULONG FormatSize;
ULONG Flags;
ULONG SampleSize;
ULONG Reserved;
GUID MajorFormat;
GUID SubFormat;
GUID Specifier;
};
ULONGLONG Alignment;
} KSDATAFORMAT, *PKSDATAFORMAT, KSDATARANGE, *PKSDATARANGE;
DirectShow 視頻捕獲的接口和屬性
DirectShow 提供了與許多視頻相關的接口,它們中的一些還有附帶相關的屬性。下面列出的這些接口是實際應用較多,並不帶相關屬性的:
· IAMAudioInputMixer
· IAMDroppedFrames
· IAMStreamConfig
· IAMVfwCaptureDialogs
· IAMVfwCompressDialogs
· IcaptureGraphBuilder
· ICreateDevEnum
下表列出了DirectShow 接口與捕獲驅動程序通訊的相關屬性。.
DirectShow 接口
|
相關屬性
|
IAMTuner |
PROPSETID_VIDCAP_TUNER |
IAMTVAudio |
PROPSETID_VIDCAP_TVAUDIO |
IAMCrossbar |
PROPSETID_VIDCAP_CROSSBAR |
IAMVideoProcAmp |
PROPSETID_VIDCAP_VIDEOPROCAMP |
IAMAnalogVideoDecoder |
PROPSETID_VIDCAP_VIDEODECODER |
IAMAnalogVideoEncoder |
PROPSETID_VIDCAP_VIDEOENCODER |
IAMCameraControl |
PROPSETID_VIDCAP_CAMERACONTROL |
捕獲數據流類型
視頻流大致由時間標記,數字視頻,和其他相關信息(比如VBI,時間編碼)組成,流可以被暫停,開始和停止。流一般是100ns一次進行數據採樣,大多數情況下,每個數據幀存放在每個ImediaSample緩存區中。
流輸出數據格式
流的數據類型由KSDATARANGE 數據結構的StreamDescriptionFlags 字段來標識,它們定義如下:
KS_VIDEOSTREAM_CAPTURE
主要的視頻流格式,用於視頻會議和把數據寫入磁盤。
KS_VIDEOSTREAM_PREVIEW
用於顯示視頻,它使用的是沒有壓縮的數據格式,所以不需要進行特別的解壓操作。
KS_VIDEOSTREAM_VBI
用於VBI應用。
KS_VIDEOSTREAM_NABTS
用於NABTS 解碼VBI 採樣.
KS_VIDEOSTREAM_CC
KS_VIDEOSTREAM_EDS
KS_VIDEOSTREAM_TELETEXT
用於圖文信息
KS_VIDEOSTREAM_STILL
用於Still image.
KS_VIDEOSTREAM_IS_VPE
用於基於VPE的數據流。
結束語
該文對windows下視頻捕獲技術做了一個簡單的介紹。以後我會針對 DirectShow下視頻捕獲寫詳細的文章!謝謝你的關注!歡迎到我的博客blog.csdn.net/suntaoznz