码迷,mamicode.com
首页 > Windows程序 > 详细

windowed模式视频渲染

时间:2015-07-31 12:36:22      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:

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

  1. 查询IvideoWindow接口(QueryInterface)
  2. 设置父窗口(put_Owner)
  3. 设置窗口模式(put_WindowStyle)
  4. 设置窗口位置(SetWindowPosition)
  5. 处理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的设置无效。(http://blog.csdn.net/bwmwm/article/details/4562709)

 

windowed模式视频渲染

标签:

原文地址:http://www.cnblogs.com/codenow/p/4691628.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!