一、DirectShow 簡介
DirectShow(簡稱 DShow) 是一個 Windows 平台上的流媒體框架,提供了高質量的多媒體流采集和回放功能。它支持多種多樣的媒體文件格式,包括 ASF、MPEG、AVI、MP3和WAV 文件,同時支持使用 WDM 驅動或早期的 VFW 驅動來進行多媒體流的采集。
-
DirectShow 大大簡化了媒體回放、格式轉換和采集工作。但與此同時,它也為用戶自定義的解決方案提供了底層流控制框架,從而使用戶可以自行創建支持新的文件格式或其他用戶的 DirectShow 組件。
-
DirectShow 專為 C ++ 而設計。 Microsoft 不提供用於 DirectShow 的托管 API。
-
DirectShow 是基於組件對象模型(COM)的,因此當你編寫 DirectShow 應用程序時,你必須具備 COM 客戶端程序編寫的知識。對於大部分的應用程序,你不需要實現自己的 COM 對象,DirectShow 提供了大部分你需要的 DirectShow 組件,但是假如你需要編寫自己的 DirectShow 組件來進行擴充,那么你必須編寫實現 COM 對象。
-
使用 DirectShow 編寫的典型應用程序包括:DVD 播放器、視頻編輯程序、AVI 到 ASF 轉換器、 MP3 播放器和數字視頻采集應用。
二、為什么需要 DirectShow
為什么需要 DirectShow?DirectShow 到底能夠做什么?帶着這兩個問題,我們先一起來看多媒體應用開發所面臨的挑戰:
(1)多媒體數據量巨大,應如何保證數據處理的高效性;
(2)如何讓音頻和視頻時刻保持同步;
(3)如何用簡單的方法處理復雜的媒體源問題,包括本地文件、計算機網絡、廣播電視以及其他一些數碼產品等;
(4)如何處理各種各樣的媒體格式問題,包括 AVI、ASF、MPEG、DV、MOV 等;
(5)如何支持目標系統中不可預知的硬件。
DirectShow 的設計初衷就是盡量要讓應用程序開發人員從復雜的數據傳輸、硬件差異、同步性等工作中解脫出來,總體應用框架和底層工作由 DirectShow 來完成,這樣,基於 DirectShow 框架開發多媒體應用程序就會變得非常簡單。
三、DirectShow 架構
DirectShow 的架構如下圖所示:
DirectShow 位於應用層中。它使用一種叫 Filter Graph 的模型來管理整個數據流的處理過程;參與數據處理的各個功能模塊叫 Filter;各個 Filter 在 Filter Graph 中按一定的順序連接成一條 "流水線" 協同工作。( 可以看出 FilterGraph 是 Filter 的容器 )
按照功能來分,Filter 大致分為三類:Source Filters、Transform Filters 和 Rendering Filters。
- Source Filters 主要負責取得數據,數據源可以是文件、因特網、或者計算機里的采集卡、數字攝像機等,然后將數據往下傳輸;
- Transform Fitlers 主要負責數據的格式轉換、傳輸;
- Rendering Filtes 主要負責數據的最終去向,我們可以將數據送給聲卡、顯卡進行多媒體的演示,也可以輸出到文件進行存儲。
在 DirectShow 系統上,我們看到的,即是我們的應用程序(Application)。應用程序要按照一定的意圖建立起相應的 Filter Graph,然后通過 Filter Graph Manager 來控制整個的數據處理過程。DirectShow 能在 Filter Graph 運行的時候接收到各種事件,並通過消息的方式發送到我們的應用程序。這樣,就實現了應用程序與 DirectShow 系統之間的交互。
四、Directshow 的前世今生
下面介紹 Direct Show 的前身 - VFW,然后是 DirectShow 的發展歷史,最后是微軟准備用來替代 DirectShow 的 Media Foundation。
1. VFW
VFW(Video for Windows)是微軟於 1992 年推出的關於數字視頻的一個 SDK,它能使應用程序通過數字化設備從傳統的模擬視頻源得到數字化的視頻剪輯。VFW 的一個關鍵思想是播放時不需要專用硬件。為了解決數字視頻數據量大的問題,需要對數據進行壓縮。VFW 引進了一種叫 AVI 的文件標准,該標准未規定如何對視頻進行捕獲、壓縮及播放,僅規定視頻和音頻該如何交錯存儲在硬盤上。VFW 給程序員提供 .VBX 和 AVICap 窗口類的高級編程工具,使程序員能通過發送消息或設置屬性來捕獲、播放和編輯視頻剪輯。
VFW 技術受到的最多批評是它捕獲的數據保存到磁盤上會占用大量磁盤空間,有人試驗用 640x480 捕獲 1s 大約需要10MB,另外 VFW 的體系結構缺乏為視頻會議,在線電視等流媒體應用提供強而有效的支持。
2. DirectShow
Direct Show 的發展歷史:
- 孕育期(1995 ~ 1998)ActiveMovie,開發代號 Quartz,在 Windows 3.0 時代,是作為一種對當時最流行的媒體平台 QuickTime 的回應而開發的。它當時的使命是作為 IE 的插件播放在其窗口內的媒體文件,正如當時 QuickTime 為 Netscape 以及 IE 提供的服務那樣,它的另一個功能是作為 VFW 的一個替換,特別地為在 VFW 架構中難於處理的 MPEG 文件提供輔助處理。
- 誕生期(1998)在這一年,大致在 DirectX 5 的年代,ActiveMovie 被重命名為 DirectShow 並且被包含為 “DirectMedia SDK” 的一部分。
- 成長期(1999 ~ 2005)在 DirectX 7 中,DirectShow 變成了 DirectX SDK 主要組成部分,而且如同 DirectInput 等其它 DirectX API 一樣被賦予了它自己的位置。DirectShow 被主要用來做音視頻捕捉和媒體文件的播放(Windows Media Player 就是基於 DShow 開發的)。
- 動盪衰落期(2005 ~ 至今) 從 2005 年 4 月起,DirectShow 從 DirectX SDK 中移除了,必須單獨下載 DirectShow 的 SDK 包才能得以支持,之后 DirectShow 的文檔和示例被轉移到 Windows SDK,DirectShow 也正式成為 Windows 的一個組件。然而,在編譯某些 DirectShow 的 sample 時,DirectX SDK 仍然是必需的。
DirectShow 對數字高清媒體的應用程序確實是非常通用的、萬能的,但是,DirectShow 作為一個 20 年的老技術而言已經力不從心了。比如:
- Graph 是靜態的,要實現動態的 Graph 和 Major format change 是非常困難的。
- DirectShow filter 的線程模型是非常復雜的,要完全理解並永不出錯是太困難了。
- DirectShow filter 只能用於DirectShow。
- DirectShow 不支持文件保護(DRM)。
於是便有了 Media Foundation。
3. Media Foundation
2005 年,微軟推出 Windows Vista,與此同時在 Windows Vista 上推出了新一代多媒體應用庫 Media Foundation(以下簡稱 MF)。目的是提供 Windows 平台一個統一的多媒體影音解決方案,開發者可以通過 MF 播放視頻或聲音文件、進行多媒體文件格式轉碼,或者將一連串圖片編碼為視頻等等。MF 是 DirectShow 為主的舊式多媒體應用程序接口的替代者與繼承者,在微軟的計划下將逐步汰換 DirectShow 技術。MF 要求Windows Vista 或更高版本,不支持較早期的 Windows 版本,特別是 Windows XP。
看起來 MF 是完美的 DShow 替代者,但實際情況卻是 MF 在推出十多年間鮮有人理會。一是 DShow 已經形成了成熟的社區,從硬件到軟件到開發庫都是非常完備的,而且 Windows 的兼容性也一直非常好,實在沒有換代的動力。二是 MF 除了在 DRM 媒體保護(Protected Media Path)方面是天然支持的,其他功能並沒有比 DShow 技高一籌,頂多是用着更簡單一些。
另外,像最新的 UWP 框架里只支持 MFT,不能用 DShow 的 Filter,所以不確定什么時候會被完全取代。
參考:
《DirectShow開發指南》1.2節 - DirectShow 簡介