当前位置:首页 > Windows程序 > 正文

windowed模式视频渲染

2021-03-28 Windows程序

如果需要使用windowed模式渲染,需要以下几个步骤:

查询IvideoWindow接口(QueryInterface)

设置父窗口(put_Owner)

设置窗口模式(put_WindowStyle)

设置窗口位置(SetWindowPosition)

处理WM_MOVE消息

过程说明性代码,简写,不做返回值判断

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的设置无效。()

windowed模式视频渲染

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/69035.html