DirectShow的中文資料之綜述與配置篇

2021-09-30 02:11:14 字數 3076 閱讀 1978

綜述篇

再你開始之前,你需要的背景知識:

1.你應該熟悉c/c++或是vb.

2.另外讓人頭痛的是部件物件模型com技術.下面我先簡單的介紹一下com的技術.

一、directx和部件物件模型com

1.1、 部件物件模型com(component object model)

directshow中的大部分api都由基於com的物件和介面組成。com是介面重利用的基於物件的系統的基礎,是com程式設計的核心模型,它也是一種介面規範。在作業系統級別上,它又是乙個物件模型。 許多directshow api都建立為com物件的例項。你可以將乙個物件看做乙個黑盒子,物件通過介面與物件通訊,通過com介面傳送給物件或從物件接收的命令稱為方法。例如

ivideowindow->setwindowposition(grc.left, grc.top, grc.right, grc.bottom);

就是通過ivideowindow的介面的方法設定顯示視窗的位置.物件在執行時可以同其他物件**在一起,並且能夠使用這些物件的介面。如果你已知道某個物件是com物件,並且知道該物件支援的介面,你的應用程式或其他物件就能夠確定第乙個物件所能執行的服務。所有com物件都繼承的乙個方法是query介面方法,它讓你確定乙個物件支援的介面和建立這些介面的指標。

1.2、iunknown 介面

所有的com 介面都由乙個稱為iunknown的介面衍生而來,該介面為directshow提供了物件生存期的控制和操作多介面發能力。iunknown含有三個方法:

.addref  當乙個介面或另乙個應用**到乙個物件上時,就使用addref方法將該物件的索引值加1。

.queryinte***ce   通過指向特定介面的指標查詢物件所支援的特性。

.release    將物件的索引值減1,當索引值變為0時,該物件就從記憶體中釋放。

其中addref和release方法負責維護物件的索引值。例如,如果建立乙個igraphbuilder 物件,該物件的索引值就被設定為1,每次當有乙個函式返回該物件的指標時,該函式必須通過返回發指標呼叫addref方法將該物件的索引值加1。每乙個addref的呼叫都必須有乙個release的呼叫與其對應。當物件的索引值達到0時,該物件就被撤消,該物件的所有介面都不可再用。

queryinte***ce方法測定乙個物件是否支援指定的介面,如果支援,queryinte***ce就返回指向該介面的指標。然後你可以使用該介面包含的方法同物件通訊。如果queryinte***ce成功地返回介面的指標,它會自動呼叫addref方法增加物件的索引值。在撤消介面指標之前必須呼叫release來減少物件的索引值。

1.3、 directshow com 介面

directshow中的介面是用相當基本的com程式設計建立的。物件的每個介面都由iunknown com介面派生而來,如igraphbuilder 、imediacontrol 和imediaeventex 都是這樣。基本物件的建立工作由動態鏈結庫dll中的特殊函式來處理。當然還有很多的其他介面,會在以後一一說明。

三.filters and pins

在流體系當中,有兩個基本的元件,filter和pin。filter是乙個com物件,他至少有乙個pin。pin也是com物件。他通過filter建立。他是各個filter的連線點。

如下圖:

輸入pin接受資料到filter中。輸出pin提供資料到其他的filter中。通常的傳輸過濾器,象壓縮,解壓(codec)過濾器,提供了乙個輸入,乙個輸出pin。

乙個過濾器有ibasefilter介面。這個介面提供的方法允許列舉在他上的pin和返回過濾器的資訊。

也提供從imediafilter繼承的方法:這些方法允許控制狀態(執行,暫停,停止)和同步。另外,filter可以有其他的幾個介面,這依賴他支援的**型別。

pin有責任提供介面連線其他的pin並傳輸資料。pin的介面支援:

1.使用共享記憶體或別的資源傳輸資料。

2.在每個pin-to-pin的連線中,商議資料的具體格式。

3.緩衝管理和緩衝分配,達到最小的資料拷貝,最大的資料吞吐量。

pin的介面也有一些細微的差別,分為輸入和輸出pin。

輸出pin通常有下面一些介面:

1.ipin方法的呼叫執行查詢pin,連線,和資料型別資訊,當filter graph停止的時候,還可以傳送通知給下游。

2.imediaseeking 允許傳播關於流的開始時間,停止時間等資訊給renderer。然後,把**位置資訊傳給上游的過濾器(一般是源過濾器)。

3.iqualitycontrol 傳送quality-control訊息給上游。

輸入pin通常有下面一些介面:

1.ipin 允許pin連線輸出pin,和提供資訊給輸出pin。

2.imeminputpin 提供共享記憶體緩衝傳輸資料。

配置篇vc的環境設定

在進行任何directshow有關的程式設計之前,你得先設定vc的環境變數值.主要是方便以後的專案設計.

1. 選擇options.

2. 選擇directories tab.

3. 在show directories for框中選擇include files

4. 在directories框中選擇一項新項,鍵入x:/dx90sdk/include 和 x:/dx90sdk/samples/c++/directshow/baseclasses,此目錄將含有所有有關的標頭檔案。

5. 在show directories for框中選擇library files

6. 在directories框中選擇一項新項,鍵入x:/dx90sdk/lib,此目錄將含有所有有關的庫檔案。

7. 選擇ok

建立guid

如果你建立自己的filter(過濾器),你需要建立乙個guid。

你可以:

選擇工具選單,選擇create guid,guid預設的是define_guid,把得到資料的貼上到你的標頭檔案中。

如果你的工具選單中沒有,你可以用你的vc目錄下的/common/tools下的guidgen.exe。

例如://

define_guid(clsid_myfilter,

0x3fa5d260, 0xaf2f, 0x11d0, 0xae, 0x9c, 0x0, 0xa0, 0xc9, 0x1f, 0x8, 0x41);

DirectShow 的重要介面

directshow 的重要介面 directshow採用了com標準,所以很多重要的功能都是通過com介面來完成。下面就列舉一些重要的directshow的介面。1 igraphbuilder介面 用於構造filter graph的介面,建立和管理一系列的filter,過濾和處理源 流。2 ime...

在directshow中實現讀取資料

最簡單的辦法就是直接新增sample grabber fliter,然後直接條用isamplegrabber的介面函式。首先宣告以下介面,並對這些介面初始化 igraphbuilder pgraph null for graph builder imediacontrol pcontrol null...

DirectShow開發快速入門之二資料流的流動

directshow資料流動概述 filter之間的資料是通過sample來傳送的。sample是乙個com元件,擁有自己的一段資料緩衝buffer,這個com元件暴露了imediasample介面。這個sample一般都有乙個叫做記憶體分配器 alloctor 的com物件來建立管理,這個物件具有...