Directshow 學習入門

2021-06-20 07:56:30 字數 1470 閱讀 4262

處理視窗訊息

2、當你接到乙個wm_displaychange訊息,你就要呼叫ivmrwindowlesscontrol::displaymodechanged.

下面的**演示了wm_paint訊息的處理:

儘管我們要自己處理onpaint訊息,但是已經非常簡單了。

如何處理事件通知(event notification)

當乙個directshow的應用程式執行的時候,在 filter graph內部就會發生各種各樣的事件,例如,乙個filter也許發生資料流錯誤。filter通過給graph mangaer傳送事件通知來和graph通訊,這個事件通知包括乙個事件碼和兩個事件引數。事件碼表示發生事件的型別,兩個引數用來傳遞資訊。

filter傳送的這些事件,其中的一部分可以被manager直接處理,不通知應用程式,但有一部分事件,manager將事件放入到乙個佇列中,等待應用程式處理。這裡我們主要討論在應用程式中經常遇到的三種事件 

ec_complete表明回放已經結束

ec_errorabort表明出現了乙個錯誤。

應用程式可以通知filter graph manager,在某個指定的事件發生時,向指定的視窗發生乙個指定的訊息。這樣應用程式就可以在訊息迴圈中對發生的事件產生反應。

首先定義訊息:

然後向filter graph manager請求imediaeventex介面,然後呼叫imediaeventex::setnotifywindow方法來設定訊息通知視窗:

imediaeventex *g_pevent = null;

g_pgraph->queryinte***ce(iid_imediaeventex, (void **)&g_pevent);

g_pevent->setnotifywindow((oahwnd)g_hwnd, wm_graphnotify, 0);

然後在windowproc函式增加乙個處理wm_graphnotify訊息的函式:

case wm_graphnotify:

handlegraphevent();

break;

handlegraphevent()函式具體定義如下

void handlegraphevent()

// get all the events

long evcode;

long_ptr param1, param2;

hresult hr;

while (succeeded(g_pevent->getevent(&evcode, ¶m1, ¶m2,0)))} }

在釋放imediaeventex指標前,要取消事件通知訊息,**如下:

// disable event notification before releasing the graph.

g_pevent->setnotifywindow(null, 0, 0);

g_pevent->release();

g_pevent = null;

directshow 學習入門 3

如何列舉系統的裝置和過濾器 1 系統裝置列舉器 系統裝置列舉器提供了乙個很好的方法根據種類來列舉系統中註冊的過慮器。也許枚一種不同的硬體都會有自己的過慮器,或許所有的硬體裝置共用同乙個filter。這個對於採用wdm驅動程式的硬體很有用。按照下面的步驟使用裝置列舉器 1 建立列舉器元件,clsid為...

directshow 入門路線

0 確定方向,到底是自己編譯庫,還是利用庫的介面再開發 工具方面,請選用較新的vs,比如2008,新的版本都自帶directshow標頭檔案。如果選用vs2005,就麻煩多多。強烈推薦乙個 2 dshow也是和gstreamer更有可比性。3 a,com知識了解一點就行了,我個人覺得不是必須要掌握。...

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

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