directshow 學習入門 3

2021-06-20 07:56:30 字數 2169 閱讀 7153

如何列舉系統的裝置和過濾器

1、系統裝置列舉器

系統裝置列舉器提供了乙個很好的方法根據種類來列舉系統中註冊的過慮器。也許枚一種不同的硬體都會有自己的過慮器,或許所有的硬體裝置共用同乙個filter。這個對於採用wdm驅動程式的硬體很有用。

按照下面的步驟使用裝置列舉器:

1) 建立列舉器元件,clsid為clsid_systemdeviceenum

2) 指定某一種型別裝置,引數clsid,通過icreatedevenum::createclassenumerator獲取某一種類的列舉器,這個函式返回乙個ienummoniker介面指標,如果該種類的空或者不存在,這個方法就返回s_false。因此,當你呼叫這個函式時一定要檢查返回值是否為s_ok,而不要用succeeded巨集。

3) 然後ienummoniker::next列舉每乙個moniker。這個方法返回乙個imoniker介面指標。

4) 要想知道裝置的名稱,可以通過下面的函式imoniker::bindtostorage

5) 然後利用imoniker::bindtoobject生成繫結道裝置上的filter。呼叫ifiltergraph::addfilter將filter新增到graph圖中。

圖1

// create the system device enumerator.

hresult hr;

icreatedevenum *psysdevenum = null;

hr = cocreateinstance(clsid_systemdeviceenum, null, clsctx_inproc_server,

iid_icreatedevenum, (void **)&psysdevenum);

if (failed(hr))

// obtain a class enumerator for the video compressor category.

ienummoniker *penumcat = null;

hr=psysdevenum->createclassenumerator(clsid_videocompressorcategory, &penumcat,0);

if (hr == s_ok) 

variantclear(&varname);

// to create an instance of the filter, do the following:

ibasefilter *pfilter;

hr = pmoniker->bindtoobject(null, null, iid_ibasefilter,(void**)&pfilter); //生成乙個filter繫結到裝置上。

// now add the filter to the graph. 

//remember to release pfilter later.

ppropbag->release();

}pmoniker->release();

}penumcat->release();

}psysdevenum->release();

在上面我們用imoniker::bindtoobject生成繫結道裝置上的filter,當然我們還可以用另外的一種方法來生成繫結到裝置上的filter

利用imoniker::getdisplayname得到moniker的名字。然後你把moniker的名字做引數傳遞給ifiltergraph2::addsourcefilterformoniker,就可以建立乙個繫結到裝置的filter了。在上面我們是呼叫imoniker::bindtoobject生成filter的,還是上面的簡單些。看看**吧。

lpolestr strname = null;

ibasefilter psrc = null;

hr = pmoniker->getdisplayname(null, null, &strname);

if (succeeded(hr))

cotaskmemfree(strname);

}// if successful, remember to release psrc.

下面的例子演示了,列舉所有的支援dv,並且至少有乙個輸出pin的filter,這個filter支援任何**型別。

Directshow 學習入門

處理視窗訊息 2 當你接到乙個wm displaychange訊息,你就要呼叫ivmrwindowlesscontrol displaymodechanged.下面的 演示了wm paint訊息的處理 儘管我們要自己處理onpaint訊息,但是已經非常簡單了。如何處理事件通知 event notif...

directshow 入門路線

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

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

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