在directshow中實現讀取資料

2021-06-07 01:35:49 字數 2292 閱讀 9542

最簡單的辦法就是直接新增sample grabber fliter,然後直接條用isamplegrabber的介面函式。

首先宣告以下介面,並對這些介面初始化:

igraphbuilder   *pgraph       = null; //for graph builder

imediacontrol   *pcontrol     = null; //media control

imediaseeking   *pseeking     = null; //media seeking

imediaeventex   *pevent       = null; //media envent

ibasefilter      *pnullfilter =null;//for holding the sample grabber filter

cocreateinstance(clsid_filtergraph, null, clsctx_inproc, 

iid_igraphbuilder, (void **)&pgraph)); 

cocreateinstance(clsid_nullrenderer, null, clsctx_inproc, 

iid_ibasefilter, (void **)&pnullfilter));

pgraph->queryinte***ce(iid_imediacontrol,(void**)&pcontrol));

pgraph->queryinte***ce(iid_imediaseeking, (void**)&pseeking));

pgraph->queryinte***ce(iid_imediaevent, (void **)&pevent));

接下來我們就可以建立sample grabber,建立過程如下:

// create the sample grabber.

ibasefilter *pgrabberf = null;

cocreateinstance(clsid_samplegrabber,null, clsctx_inproc_server, 

iid_ibasefilter, (void**)&pgrabberf));

pgraph->addfilter(pgrabberf, l"sample grabber"));

pgraph->addfilter(pnullfilter, l"null render filter")); 

isamplegrabber *pgrabber;

pgrabberf->queryinte***ce(iid_isamplegrabber, (void**)&pgrabber));

在建立過程中我們需要設定其**型別:即呼叫setmediatype,該函式接受乙個am_media_type的結構,主要是設定該結構中的majortype,和subtype域,以便抓取我們所需要的資料。同時還需設定一下其它東西:

hr = pgrabber->setbuffersamples(true); 

這個是設定可否複製buffer裡面的資料,我們選擇true,

// only grab one at a time, stop stream after

// grabbing one sample

hr = pgrabber->setoneshot( true );

如果這個設定為true的話當我們grab的時候整個流便會停止,即directshow停止繼續運作。

接下來我們需要在新增source filter並可以自己手動連線或者選擇智慧型連線renderstream(),然後整個流程開始工作。

當連線完成開始工作後我們可以用graphedit工具來看一下我們所加入的sample grabber是否已經正確連線在其。然後我們便可以開始取得當前buffer裡面的資料了,通過以下方式:

// find the required buffer size.

long cbbuffer = 0;

hr = pgrabber->getcurrentbuffer(&cbbuffer, null); 

longlong currentpos;

pseeking->getcurrentposition(¤tpos); 

byte *pbuffer = new byte[cbbuffer];

if (!pbuffer) 

hr = pgrabber->getcurrentbuffer(&cbbuffer, (long*)pbuffer);

其中cbbuffer返回的是當前buffer裡資料的大小,即乙個sample的大小,然後我們變可以開始負責buffer裡面的資料進行處理了。

C 實現DirectShow技術開發準備

directshow元件在 c windows system32 目錄下的quartz.dll動態庫中,要使c 引用com物件和介面,必須將com型別庫轉換為.net框架元資料,從而有效地建立乙個可以從任何託管語言呼叫的託管包裝。在轉換過程中需要使用framework sdk自帶的tlbimp命令工...

在快樂中工作 讀《乾法》心得

我是利用封閉開發,在飛機上閱讀了楊總推薦的 乾法 一書。實話實說,剛開始讀時,我總覺得這本書講得太過理想化,人怎麼可能都如稻盛和夫先生般拼命工作呢?但是,當我慢慢向後讀,細細品味,我才理解先生的工作觀和價值觀源於熱愛。熱愛他的工作,熱愛他所從事的職業,熱愛他所付出的勞動。因為有了熱愛,才能體會工作中...

在 中實現 加密

在 中的專案中,新增引用 system.web 然後 str2 system.web.security.formsauthentication.hashpasswordforstoringinconfigfile str1,md5 就ok了,如果要換成 sha1 加密形式,只要把 md5 換成 md...