DShow之使用VMR进行Windowless控制

转载 2006年06月20日 13:19:00
一般步骤:
  1. 创建Graph Builder接口
  2. 创建VMR接口并加入到GraphBuiler中
  3. 查询IVMRFilterConfig接口设置VMR为VMRMode_Windowless模式;查询IVMWindowlessControl接口设置VMR的显示窗口为Application的窗口。
  4. Render视频文件
  5. SetVideoPositon设置视频显示的位置
  6. 查询IMedialControl接口并Run
  7. 相应WM_PAINT消息,注意分别重绘挖去视频窗口的背景和视频窗口(pWc->RepaintVideo)
  8. 清理工作(何时清理那些接口,目前还不清楚,以后再研究^_^)
 
 
还是先写注意吧,因为注意容易忘,而过程写起来比较困难些,呵呵
注意:
  1. 播放没有自己的窗口,是直接把视频绘制(Paint)在Application的窗口上的,所以当Application需要响应WM_PAINT消息的时候,要注意对视频的绘制(Paint)。

    此时,Windowless的视频播放“窗口”(实际上是windowless的)和Application的窗口应该分开来单独重绘(相应WM_PAINT)。

    首先,检测Application的窗口上windowless的视频窗口中是否有video:if (pWc). 其中pWc是创建的IVMRWindowlessControl接口。如果pWc != NULL则表示有video,此时通过创建一个CombineRgn把windowless窗口挖去,先重绘这个CombineRgn,然后再调用pWc->RepaintVideo重绘windowless视频窗口。即

    void OnPaint(HWND hwnd) 
    { 
        PAINTSTRUCT ps; 
        HDC         hdc; 
        RECT        rcClient; 
        GetClientRect(hwnd, &rcClient); 
        hdc = BeginPaint(hwnd, &ps); 
        if(g_pWc) 
        { 
            HRGN rgnClient = CreateRectRgnIndirect(&rcClient); 
            HRGN rgnVideo  = CreateRectRgnIndirect(&g_rcDest);  // Saved from earlier.
            CombineRgn(rgnClient, rgnClient, rgnVideo, RGN_DIFF);  // Paint on this region.
    
            HBRUSH hbr = GetSysColorBrush(COLOR_BTNFACE); 
            FillRgn(hdc, rgnClient, hbr); 
            DeleteObject(hbr); 
            DeleteObject(rgnClient); 
            DeleteObject(rgnVideo); 
    
            // Request the VMR to paint the video.
            HRESULT hr = g_pWc->RepaintVideo(hwnd, hdc);  
        } 
        else  // No video image. Just paint the whole client area. 
        { 
            FillRect(hdc, &rc2, (HBRUSH)(COLOR_BTNFACE + 1)); 
        } 
        EndPaint(hwnd, &ps); 
    } 

  2. VMR COM接口的类型是 IBaseFilter、 CoCreateInstance第三参数是IID_IBaseFilter
    Graph Buider的是IGraphBuilder、CoCreateInstance第三参数是IID_IGraphBuilder

  3. 创建了VMR实例接口后,应该把该Filter加入到Graph Builder中去。
    pGraph->AddFilter(pVmr, L"Video Mixing Render"); //第二个参数似乎可以随便取个名字,只是个名称而已

  4. 创建了VMR并加入到Graph Builder中后,应该配置VMR。这里需要先后查询两个接口:IVMRFilterConfig和IVMRWindowlessControl,设置渲染模式为windowless(pConfig->SetRenderingMode)、设置VMR的窗口为Application的窗口(pWc->SetVideoClippingWindow(hWinMain))

  5. 还需要指定windowless视频窗口在Application窗口中的位置:pWc->SetVideoPositon(&rcSrc, &rcDest)。这里有两个RECT,分别代表源视频的尺寸区域和要显示在窗口上的区域尺寸。可以通过pWc->GetNativeVideoSize((&lWidth, &lHeight, NULL, NULL)获得源区域尺寸,然后设定要取源画面的多少尺寸Rect:SetRect(&rcSrc, 0, 0, lWidth/2, lHeight/2)//此时只取源画面的1/2。再设定好显示的区域rcDest后用pWc->SetVideoPositon设定。

  6. COLOR_BTNFACE + 1是什么意思?好像+1不+1都差不多呀?

相关文章推荐

DirectShow实现抓图(Delphi)

unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,...
  • formiss
  • formiss
  • 2007年05月10日 17:24
  • 5155

dshow_windowless_mode

  • 2017年02月22日 15:23
  • 128KB
  • 下载

3.使用DShow进行摄像头预览并拍照

上一篇讲了怎么采集摄像头图像并预览,本篇主要讲预览的同时怎么拍照。 拍照就需要抓取图像,这里要用到一个不太一样的Filter,叫SampleGrabber Filter,通过这个Filter可以获取到...
  • klamen
  • klamen
  • 2017年02月10日 13:03
  • 927

2.使用DShow进行摄像头预览

上一篇已经获取了视音频设备和编解码器,可能大家有疑问,获取到这些后怎么使用,这里必须得说说Filter了,可以把每个Filter理解成与设备是一一对应关系,每个Filter就像是一个黑盒子,它把与硬件...
  • klamen
  • klamen
  • 2017年02月09日 16:27
  • 516

DShow中filter的property page实现过程(以DsNetWork为例进行摘抄)

step1: expose a custom COM interface//denetifc.idl, use the MIDL compiler to create the header file ...

D3D下使用VMR9播放视频(2)

program VmrAlloc; uses   Windows,   Messages,   untVideo in 'untVideo.pas';const   AppName = 'VmrAll...

D3D下使用VMR9播放视频文件

随着DX开发包的不断升级,其提供给媒体程序开发人员的接口功能也空前强大起来。本文就D3D下使用VMR9播放视频向初学者谈谈心得。高手请止步(不想让你看了吐血^_^)。        早在DX8时代,...

1.使用DShow获取本机的视音频设备和自带编解码器列表

最近做摄像头开发,用opencv做视频的采集工作,但opencv有个问题,采集出来的数据只有视频,不支持音频,而且即使是视频的采集也是封装的DSHOW的采集方案,所以想把之前做的程序换成DShow的。...
  • klamen
  • klamen
  • 2017年02月09日 14:47
  • 806

4.使用DShow采集摄像头图像和麦克风声音到本地(摄像头录制)

上一篇介绍如何拍照,这一篇介绍一下如何录制摄像头视频和麦克风的声音,并合成一个视音频文件(avi)。 在上一篇的基础上,需要再创建一个本机音频采集设备的Filter,注意,如果你的机器没有音频采集设备...
  • klamen
  • klamen
  • 2017年02月10日 16:50
  • 910

dshow中使用Sample Grabber filter抓取图像

sample Grabber使用两种模式抓取图像:缓冲模式和回调模式,缓冲模式向下传递采样时拷贝每个采样,而回调模式对于每个采样调用程序定义的回调函数。回调模式是动态加载filter,影响程序性能,甚...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DShow之使用VMR进行Windowless控制
举报原因:
原因补充:

(最多只允许输入30个字)