标签:
如果需要使用windowed模式渲染,需要以下几个步骤:
过程说明性代码,简写,不做返回值判断
HRESULT hr=CoInitialize(NULL); IGraphBuilder *pGraphbuilder; hr=CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,(void **)&pGraphbuilder); pGraphbuilder->RenderFile(L"D:\\direct_show\\Extras\\DirectShow\\Samples\\Media\\Video\\ruby.avi", 0); IVideoWindow *pVideoWin=NULL; hr=pGraphbuilder->QueryInterface(IID_IVideoWindow,(void **)&pVideoWin); hr=pVideoWin->put_Owner((OAHWND)m_hWnd); hr=pVideoWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS); RECT rect; GetClientRect(&rect); hr=pVideoWin->SetWindowPosition(0,0,rect.right,rect.bottom); IMediaControl *pcontrol; IMediaEvent *pevent; hr=pGraphbuilder->QueryInterface(IID_IMediaControl,(void **)&pcontrol); hr=pGraphbuilder->QueryInterface(IID_IMediaEvent,(void **)&pevent); pcontrol->Run(); long evcode=0; hr=pevent->WaitForCompletion(INFINITE,&evcode); pcontrol->Release(); pevent->Release(); pGraphbuilder->Release(); CoUninitialize();
case WM_MOVE: pVidWin->NotifyOwnerMessage((OAHWND)hWnd, msg, wParam, lParam); break;
清理工作:
pControl->Stop(); pVidWin->put_Visible(OAFALSE); pVidWin->put_Owner(NULL);
需要注意的是:
RenderFile函数的调用必须要在put_Owner函数之前,不然put_Owner函数的返回值为S_NOINTERFACE.
这个例子中,看不到添加任何filter的影子,既没有Source Filter ,又没有Render Filter,仅仅一句RenderFile()。是的,RenderFile()干了所有的事情。
首先IGraphBuilder::RenderFile()调用IGraphBuilder::AddSourceFilter()向Graph中添加一个Source
Filter。IGraphBuilder::AddSourceFilter()会根据文件扩展名或者是文件头等信息智能选取一个匹配文件的Source
Filter。
然后IGraphBuilder::RenderFile()调用IGraphBuilder::Render()完成剩下的Graph的生成。IGraphBuilder::Render()会从Source
Filter的output pin开始寻找每一个匹配此pin的Filter加入到链路中来,直到找到一个Render
Filter为止。当整个链路完成,也就代表Graph生成,可以调用pControl->Run()运行Graph了。
虽然IVideoWindow是由Filter
Graph Manager暴露,但是IVideoWindow设置属性却是对Render
Filter。在没有执行RenderFile之前,Graph中没有连接RenderFile,因此IVideoWindow的设置无效。(http://blog.csdn.net/bwmwm/article/details/4562709)
标签:
原文地址:http://www.cnblogs.com/codenow/p/4691628.html