| 发表于: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。 | | |
|