必威电竞|足球世界杯竞猜平台

DirectShow
來源:互聯(lián)網(wǎng)

DirectShow是微軟在ActiveMovie和Video for Windows的基礎(chǔ)上推出的新一代基于COM(Component Object Model)的流媒體處理的開發(fā)包,與DirectX開發(fā)包一起發(fā)布。DirectShow使用一種叫Filter Graph的模型來管理整個數(shù)據(jù)流的處理過程,運用DirectShow,我們可以很方便地從支持WDM驅(qū)動模型的采集卡上捕獲數(shù)據(jù),并且進行相應(yīng)的后期處理乃至存儲到文件中。這樣使在多媒體數(shù)據(jù)庫管理系統(tǒng)(MDBMS)中多媒體數(shù)據(jù)的存取變得更加方便。它廣泛地支持各種媒體格式,包括Asf、Mpeg、Avi、Dv、Mp3、Wave等,為多媒體流的捕捉和回放提供了強有力的支持。

簡介

DirectShow是微軟提供的一套在Windows平臺上進行流媒體處理的開發(fā)包,9.0之前與DirectX開發(fā)包一起發(fā)布,之后包含在windows SDK中。

它廣泛地支持各種媒體格式,包括Asf、Mpeg、Avi、Dv、Mp3、Wave等等,使得多媒體數(shù)據(jù)的回放變得輕而易舉。另外,DirectShow還集成了DirectX其它部分(比如DirectDraw、DirectSound)的技術(shù),直接支持DVD的播放,視頻的非線性編輯,以及與數(shù)字攝像機的數(shù)據(jù)交換。

歷史

ActiveMovie,開發(fā)代號 Quartz,這個由 Geraint Davies 為微軟設(shè)計的 DirectShow 的前身,在 Windows 3.0 時代,是作為一種對當時最流行的媒體平臺 QuickTime 的回應(yīng)而開發(fā)的。ActiveMovie 最早的出現(xiàn)是被附加在 Windows 95 上面的并且需要系統(tǒng)安裝了 IE3.0 。它當時的使命是作為 IE 的附件播放在其窗口內(nèi)的媒體文件,正如當時 QuickTime網(wǎng)景 以及 IE 提供的服務(wù)那樣,它的另一個功能是作為 Windows 視頻技術(shù)(VFW,Video For Windows)的一個替換,特別地為在 VFW 架構(gòu)中難于處理的 MPEG(移動圖象專家組格式文件)文件提供輔助處理。

在 1998 年,大致在 DirectX 5 年代的時候,ActiveMovie 被重命名為 DirectShow(反映了微軟在那時正在努力加強“直接地”在一個通常的取名系統(tǒng)之下與硬件合作的技術(shù))并且被包含為 " DirectMedia SDK" 的一部份。在 DirectX 的 7 版中,DirectShow 變成了 DirectX SDK 主要組成部分而且如同 DirectInput 等其它 DirectX APIs 一樣被給予了它自己的位置。甚至之后, DirectShow 被主要用來接收來自像一個手提攝像機這樣的電視輸入裝置的數(shù)據(jù),而且它從文件中顯示數(shù)據(jù)的能力被廣泛用在 Windows Media Player 上面。從 2005 年四月起,DirectShow 被從 DirectX SDK 移除,必須單獨下載Extra包才能得以支持,之后DirectShow的文檔和示例被轉(zhuǎn)移到Windows SDK,DirectShow也正式成為Windows的一個組件。然而,在編譯某些 DirectShow 的示例時,DirectX SDK 仍然是必需的。

設(shè)計

DirectShow 運行的方式通常是一個開發(fā)者創(chuàng)建一個 Filter Graph,把一些 Filter - 可能訂制 - 加入 Filter Graph,然后播放文件,或者播放來自互聯(lián)網(wǎng)或照相機的數(shù)據(jù)。當播放進程運行時,F(xiàn)ilter Graph 在 Windows 注冊中尋找注冊了的 Filters 并且為這些 Filter 創(chuàng)建本地提供的 Graph 。在這之后,它將所有的 Filter 連接在一起,并且在開發(fā)者的請求下,播放/中止創(chuàng)造的Graph。

為一個 mp3 文件創(chuàng)建的 Filter graph,由 DirectShow 自帶的示例 GraphEdit 來播放。在這幅圖中大的方塊代表 Filter graph ,小的方塊代表端口。每個Filter表示數(shù)據(jù)處理過程的一個階段,舉例來說從一個文件或照相機讀取數(shù)據(jù),解碼,轉(zhuǎn)換以及繪制。filter 有若干的能被連接到其他 filter 上的連接點的Interface。Interface可能是輸出或輸入。根據(jù) filter,數(shù)據(jù)被采用“拉模式”從輸出端口輸出,或者以“推模式”被推到另一個輸入端口,并借此來傳輸數(shù)據(jù)。大多數(shù) filters 的創(chuàng)建使用了一組 DirectShow SDK 提供的 C++類,叫做 DirectShow BaseClass。這些為 filters 解決了許多創(chuàng)建,注冊和連接的問題。如果要讓 filter graph 能夠自動的使用 filters,它們需要在一個分開的 DirectShow 項目中被登記并與 COM 一起登記。這一個注冊能被 DirectShow BaseClass處理。然而,如果應(yīng)用程序手工增加 filters,他們不需要被全然登記。不幸地,它難以修改一個正在運行中的 graph 。從頭停止 graph 而產(chǎn)生一個新 graph 通常是比較容易的。

功能

在 DirectShow 中有許多抽象的播放源文件的方法,實現(xiàn)這些功能也是相當簡單的而且不需要一個定制過的 filter 。下一步相對復(fù)雜的過程是程序開發(fā)員需要開發(fā)他(她)自己的 filter graph ,舉個例子他們可能設(shè)計一個可以接受來自互聯(lián)網(wǎng)或是硬盤文件數(shù)據(jù)的 source filter ,也許有些定制的 filter 就是開發(fā)者想要的,接下來他們需要讓 DirectShow 為用戶完成一個 filter Graph 并將所有 filter 連接起來,在最后開發(fā)者僅僅只用讓 DirectShow 為他們生成一個可以獲取文件數(shù)據(jù)的 source filter 就可以了。

DirectShow 預(yù)先設(shè)置支持許多通常的媒體格式,如 MP3,和 Windows 媒體視頻和一些比較常見的格式,比如簡單的靜態(tài)圖像。自從在 Windows 中這些技術(shù)被許可了,對 Fraunhofer 來說就沒有為專利權(quán)而付出花費的必要了,比如 MP3 執(zhí)照。擴充機制允許 DirectShow 在將來可以支持出現(xiàn)的任何格式,舉例來說,已經(jīng)有對 Ogg Vorbis 文件和 AC3 文件的支持 filters ,此外還有若干其它的支持 filters 。

不同于為了讀取媒體文件必須在循環(huán)中需要調(diào)用 MoviesTask 的為 QuickTime 設(shè)計的 main C API ,DirectShow 以一種透明的方式處理這個問題。它在后臺創(chuàng)建了一些線程來平緩的播放這些來自文件和互聯(lián)網(wǎng)的數(shù)據(jù)與此同時不需要程序做很多任務(wù)作。還跟 QuickTime 正好相反的是,在讀取一段來自互聯(lián)網(wǎng)數(shù)據(jù)而不是讀取硬盤文件的時候沒有特別的需要——DirectShow 的 filter graph 摘錄了來自程序的這些明細。然而,QuickTime(包括一個 ActiveX 控制)在這方面的發(fā)展相比之下遜色很多。

評價

播放一個文件是一項相對簡單的任務(wù),不過對于像是從視頻窗口接收特定窗口信息到創(chuàng)建特定 filters,開發(fā)者會不斷地遇到 DirectShow API 的黑暗面。 DirectShow 因其復(fù)雜性而聲名狼藉與此同時很多人認為它是微軟最復(fù)雜的libraries/APIs。在“微軟public.win32.programmer.directx.video”新聞群組上存在一個長期的灰色笑話,講的是每當某人想要為 DirectShow 開發(fā)一個新的 filter 時,那么“六個月后見吧”。

開發(fā)者很少直接創(chuàng)建 DirectShow filters - 他們通常使用被稱為“ DirectShow 基礎(chǔ)類”的一組像 mfc 一樣的(不需要 MFC)類別而開發(fā)者通常將會使用這些類來處理大多數(shù)工作。基本類的大小幾乎是在代碼中整個 MFC library類大小的一半。即使有了基本類,DirectShow 中存在的 組件對象模型 對象的絕對數(shù)量也是巨大的,甚至可以顛覆那些開發(fā)者想要開發(fā)的那種本以為相當直接的東西。 DirectShow's 的 API 有時違反一些傳統(tǒng)的 COM 規(guī)則,比如關(guān)于關(guān)于參數(shù)到方法,雖然那些通常被證明了的。因此,為了制止這些情形,開發(fā)者時常使用 DirectShow 本身中較高層次的 API,即 Windows Media Player SDK,它提供了一個有較少 COM 接口處理的 ActiveX 控制。 DirectShow 也因它對數(shù)據(jù)管理權(quán)限的支持而受到批評。然而當 DirectShow 本身有的 API 對 DRM 只有最小支持的時候,它在這情況只是一個名義上的領(lǐng)導者。在這個案例中真正的“壞人”事實上是被從 DirectShow 分開的 Windows Media Player SDK 因為它是對 DRM 有最多支持的地方。在相同方面,DirectShow 也因?qū)Φ谌矫襟w播放器功能的限制而受到指責,也就是說,在播放媒體文件方面,對Windows Media Player以外的媒體播放器存在不公。

參考資料 >

生活家百科家居網(wǎng)