最簡單的辦法就是直接新增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...