windowed模式视频渲染

如果需要使用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)

时间: 2024-09-21 08:26:34

windowed模式视频渲染的相关文章

ng-table dataset 模式 渐进式渲染

有大批量的数据需要在列表中单页显示,如果数据全部加载完毕后一次性渲染到界面会出现页面一直空白或者状态切换响应半天,这不是一个好的用户体验:正因为如此,采用渐进式渲染的思想,设置数据以一定的粒度进行渲染,会看到页面上的数据在瀑布式的加载,不至于让用户看着白屏或者一直等待跳转响应,从感官上告诉用户数据量比较大并且正在加载中:因为是单页显示所有的数据,只需要请求后台一次,使用NgTable 的dataset 模式渲染列表,排序.过滤.分页就可以在客户端实现,业务中不需要分页,并且搜索为多层次只能请求服

使用D3D渲染YUV视频数据

源代码下载 在PC机上,对于YUV格式的视频如YV12,YUY2等的显示方法,一般是采用DIRECTDRAW,使用显卡的OVERLAY表面显示.OVERLAY技术主要是为了解决在PC上播放VCD而在显卡上实现的一个基于硬件的技术.OVERLAY的出现,很好的解决了在PC上播放VCD所遇到的困难.早期PC处理能力有限,播放VCD时,不但要做视频解码工作,还需要做YUV到RGB的颜色空间转换,软件实现非常耗费资源,于是,YUV OVERLAY表面出现了,颜色空间转换被转移到显卡上去实现,显卡做这些工

peerconnection例子渲染本地视频

调试peerconnection例子,在WebRtcSession::CreateChannels函数中加上断点,呼叫端和被呼叫端创建通道的流程并不一样.呼叫端是从PeerConnection::SetLocalDescription往下执行创建的,而被呼叫端则是收到对端发来的消息后调用PeerConnection::SetRemoteDescription往下执行创建的.根据WebRtcSession::CreateChannels函数创建VoiceChannel和VideoChannel的流

设置WebBrowser内核渲染模式

前不久开发一个项目,是采用WebBrowser作为外壳,加载网页,由于网页是采用html5来进行开发的,当通过WebBrowser加载网页后,html5中的特性 都无法正常显示,而通过ie浏览器打开时能够正常显示,经过研究发现WebBrowser默认是通过ie7的兼容模式来进行渲染,因此html5的特性无法显示.那么 我们该如何更改WebBrowser内核的渲染模式呢? Internet Explorer Architecture 首先了解一下IE的整个架构,如下图 ShDocVw 及以下就是W

使用D3D渲染YUV视频数据<转>

源代码下载 转载地址:http://blog.csdn.net/dengzikun/article/details/5824874 源码地址:http://download.csdn.net/download/dengzikun/2909129 在PC机上,对于YUV格式的视频如YV12,YUY2等的显示方法,一般是采用DIRECTDRAW,使用显卡的OVERLAY表面显示.OVERLAY技术主要是为了解决在PC上播放VCD而在显卡上实现的一个基于硬件的技术.OVERLAY的出现,很好的解决了在

正则分割字符串、页面状态、渲染模式

//正则分割字符串 1 var ids=document.getElementsByClassName("div2"); 2 var cls=ids[0].className.split(/\s+/); 3 alert(cls.length); 4 for (var i = 0; i <cls.length; i++) { 5 if(cls[i] == "divs"){ 6 alert(i+" "+cls[i]); 7 }else if(c

Flash的视频神奇StageVideo

在过去的几年里,视频已经成为web网页上最主流的趋势之一,这主要是由Adobe Flash Player来推动的.2007年Flash Player 9中引入了H.264和全屏支持技术,通过在web页面上的沉浸式高清视频体验,实实在在地改变了局面.最近,在移动设备上实现的Flash Player已经为Adobe公司的Flash Player项目组带来了新的思路,这些新的思路将帮助项目组解决如何在Flash中播放视频以及如何持续增强用户体验等问题.Stage video便是这些投入所得的成果. F

简易视频聊天软件的快速开发(QT5.3)

为了在linux平台下快速开发一款视频聊天软件,本文选取了AnyChat SDK作为核心开发,开发环境使用QT5.3,下面将讲解我的开发过程. 一.      开发环境的搭建 1.           首先,虚拟机安装linux系统,我选取的是最新的Ubuntu14.04-32bit : 2.           然后,到QT官网http://qt-project.org/downloads,下载最新的linux版本QT5.3.2,如下所示: 3.            最后,到AnyChat官

视频剪辑软件调研(格式工厂,爱剪辑,会声会影)

视频剪辑软件产品调研分析,互联网短视频快速放大了对视频剪辑软件产品的需求,视频剪辑软件产品一般比较复杂庞大,默认选择视频剪辑软件产品作为调研对象,如有感兴趣的其他软件产品也可以作为调研对象. 至少选用三款产品实际使用制作短视频,并总结列举他们的基本功能特点差异(表格对比基本功能特点) 他们的目标都是盈利么?他们的目标都是赚取用户的现金么?还是别的? 对比他们的售价 这些软件是如何到你手里的(邮购,下载,互相拷贝--) 这些软件有Bug 么?又是如何更新新版本的? 此类软件是什么时候开始出现的,同