您的位置:程序门 -> vc/mfc -> 图形处理/算法



如何使用driectshow 播放avi。用filter。


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


如何使用driectshow 播放avi。用filter。[已结贴,结贴人:zxcdewq]
发表于:2007-07-12 12:55:55 楼主
最好有完整代码。
谢谢
发表于:2007-07-12 13:31:001楼 得分:50
#include   <dshow.h>
#include   <atlbase.h>
#include   <stdio.h>

#pragma   comment(   lib,   "strmiids.lib "   )
#pragma   comment(   lib,   "winmm.lib "   )

igraphbuilder       *pgb   =   null;
imediacontrol       *pmc   =   null;
imediaeventex       *pme   =   null;
ivideowindow         *pvw   =   null;
ibasicaudio           *pba   =   null;
ibasicvideo           *pbv   =   null;
imediaseeking       *pms   =   null;
imediaposition     *pmp   =   null;
ivideoframestep   *pfs   =   null;

hresult   playmovieinwindow(   lpctstr   szfilename   )
{
uses_conversion;
wchar   wfilename[max_path];
hresult   hr   =   e_fail;

if(   !szfilename   )
return   e_pointer;

wcsncpy(   wfilename,   t2w((lptstr)szfilename),   max_path   -   1   );
wfilename[max_path   -   1]   =   l '\0 ';

hr   =   cocreateinstance(   clsid_filtergraph,   null,   clsctx_inproc_server,  
      iid_igraphbuilder,   (void   **)&pgb   );

if(   succeeded(hr)   )
{
hr   =   pgb-> renderfile(   wfilename,   null   );
if(   failed(hr)   )
{
safe_release(   pgb   );
return   e_fail;
}

pgb-> queryinterface(   iid_imediacontrol,   (void   **)&pmc   );
pgb-> queryinterface(   iid_imediaeventex,   (void   **)&pme   );
pgb-> queryinterface(   iid_imediaseeking,   (void   **)&pms   );
pgb-> queryinterface(   iid_imediaposition,   (void   **)&pmp   );
pgb-> queryinterface(   iid_ivideowindow,   (void   **)&pvw   );
pgb-> queryinterface(   iid_ibasicaudio,   (void   **)&pba   );
pgb-> queryinterface(   iid_ibasicvideo,   (void   **)&pbv   );
pgb-> queryinterface(   iid_ivideoframestep,   (void   **)&pfs   );

pme-> setnotifywindow(   (oahwnd)ghwnd,   wm_graphnotify,   0   );
pvw-> put_messagedrain(   (oahwnd)ghwnd   );

long   lvisible;
if(   succeeded(   pvw-> get_visible(   &lvisible   )   )   )
{
//   video
pvw-> put_owner(   (oahwnd)ghwnd   );
pvw-> put_windowstyle(   ws_child   ¦   ws_clipsiblings   ¦   ws_clipchildren   );
}

pmc-> run();
}

return   hr;
}

上面可以实现directshow自动连接filter播放所有文件,如果要按照自己的连接来播放,就要看看filter的连接了,用下面接口函数:ibasefilter,ipin,ienumpins,   igraphbuilder::connect等,注意要装directx   sdk。
发表于:2007-07-12 14:22:532楼 得分:0
谢谢!
我就是想做一个简单的对于非压缩avi,使用自己的连接播放。我刚学directshow2天所以很多东西不明白。如果能有更详细的讲解更加感谢了!


快速检索

最新资讯
热门点击