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都差不多呀?

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

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

DShow代码分析(适合filter有开发经验的人士)

相信大家都用过Windows Media Player,当打开一个文件以后,它会根据文件的类型自动选择合适的解码器,如果找不到合适的解码器,系统会提示说:无法识别的媒体格式。在Directshow的专...
  • chenlycly
  • chenlycly
  • 2014年10月12日 17:59
  • 1325

如何编译ffmpeg以支持dshow设备

在configure ffmpeg工程时,如果不特别指定,默认fdshow设备是被支持的,但编译后却没有.可以查看configure的日志文件,会发现找不到一些依赖的头文件.所以最终编译出来的ffmp...
  • cuoban
  • cuoban
  • 2016年02月28日 00:42
  • 436

在windowless=true的条件下让silverlight输入中文

让silverlight在windowless=ture的条件下输入中文。大家都知道,silverligt2.0 和最新的3.0再windowless=true的条件下都无法输入中文,那么我们就必须采...
  • swqqcs
  • swqqcs
  • 2013年10月02日 11:39
  • 1902

DSHOW 显示视频

原文链接 显示视频 DirectShow 提供了如下过滤器来显示视频: l    Video Renderer 过滤器. 该过滤器可用于所有的支持DirectX的平台,它对平台没有其它特殊的要...
  • yuan_lo
  • yuan_lo
  • 2016年09月23日 14:42
  • 366

如何编译ffmpeg以支持dshow设备

fmpeg已经能支持dshow设备了! 但编译时会遇到一些麻烦.在此把我的编译历程总结一下,以使后来者的心灵免遭蹂躏. 先说一下我的编译环境: mingw+msys,ffmp...
  • heng615975867
  • heng615975867
  • 2014年03月22日 08:56
  • 2777

Dshow获取设备信息

dshow开发可以参照网上流行的dshow开发笔记
  • xxq123321
  • xxq123321
  • 2014年11月18日 14:38
  • 867

win10系统 dshow 调用失效修复案例

01 问题现象系统win10 企业版,安装了n多开发工具vs20XX,eclipseXX,adboe、VirtualBox、VMware、androidstudio等等。 不知何故,有一天系统变量%...
  • longji
  • longji
  • 2017年03月15日 17:57
  • 497

转载,写的不错的一个关于dshow的文章

转载地址:http://blog.sina.com.cn/s/blog_a2e5bcda01019gkg.html 六、自己写一个“filter”(1) (2012-12-04 09:40:59)...
  • xuxinhua
  • xuxinhua
  • 2015年10月09日 10:12
  • 1232

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

最近做摄像头开发,用opencv做视频的采集工作,但opencv有个问题,采集出来的数据只有视频,不支持音频,而且即使是视频的采集也是封装的DSHOW的采集方案,所以想把之前做的程序换成DShow的。...
  • klamen
  • klamen
  • 2017年02月09日 14:47
  • 1135
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DShow之使用VMR进行Windowless控制
举报原因:
原因补充:

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