DirectShow提供两种窗口模式:Windowed Mode 和 Windowless Mode。

Windowed Mode:DS创建一个属于自己的窗口,在自己创建的窗口上显示视频。通过IVideoWindow接口来管理这个窗口,适用于Video Renderer filter。

Windowless Mode:DS不提供自己创建的窗口,而是要应用程序提供窗口,用户可以将视频显示在自己指定的任意的窗口上。通过IVMRFilterConfig和 IVMRWindowlessControl来控制显示属性,适用于Video Mixing Renderer Filter 7 (VMR-7) 和 Video Mixing Renderer Filter 9 (VMR-9)。

上一篇文章属于Windowed Mode,只需要再QueryInterface出IVideoWindow接口的指针,即可通过IVideoWindow的各种功能函数设置窗口的属性。

Windowless Mode复杂一点,需要先指定窗口。下面的程序摘自MSDN(MSDN中的原始代码有一点点小错误,这里已经修改过来)

指定窗口函数:

HRESULT InitWindowlessVMR(
                          HWND hwndApp,                  // 指定窗口的句柄,输入参数
                          IGraphBuilder* pGraph,         // Filter Graph Manager指针,输入参数.
                          IVMRWindowlessControl** ppWc  // 输出参数.
                          )
{
    if (!pGraph || !ppWc) return E_POINTER;
    IBaseFilter* pVmr = NULL;
    IVMRWindowlessControl* pWc = NULL;
    // Create the VMR.
    HRESULT hr = CoCreateInstance(CLSID_VideoMixingRenderer, NULL,
        CLSCTX_INPROC, IID_IBaseFilter, (void**)&pVmr);
    if (FAILED(hr))
    {
        return hr;
    }

// Add the VMR to the filter graph.
    hr = pGraph->AddFilter(pVmr, L"Video Mixing Renderer");
    if (FAILED(hr))
    {
        pVmr->Release();
        return hr;
    }
    // Set the rendering mode. 
    IVMRFilterConfig* pConfig;
    hr = pVmr->QueryInterface(IID_IVMRFilterConfig, (void**)&pConfig);
    if (SUCCEEDED(hr))
    {
        hr = pConfig->SetRenderingMode(VMRMode_Windowless);
        pConfig->Release();
    }
    if (SUCCEEDED(hr))
    {
        // Set the window.
        hr = pVmr->QueryInterface(IID_IVMRWindowlessControl, (void**)&pWc);
        if( SUCCEEDED(hr))
        {
            hr = pWc->SetVideoClippingWindow(hwndApp);
            if (SUCCEEDED(hr))
            {
                *ppWc = pWc; // Return this as an AddRef'd pointer.
            }
            else
            {
                // An error occurred, so release the interface.
                pWc->Release();
            }
        }
    }
    pVmr->Release();
    return hr;
}

调用此函数播放视频文件的完整代码:

pGraph = NULL;
    pControl = NULL;
    pEvent = NULL;
    pWLC = NULL;

HRESULT hr = CoInitialize(NULL);
    if (FAILED(hr))
    {
        printf("ERROR - Could not initialize COM library");
        return 0;
    }
    // Create the filter graph manager and query for interfaces.
    hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
        IID_IGraphBuilder, (void **)&pGraph);
    if (FAILED(hr))
    {
        printf("ERROR - Could not create the Filter Graph Manager.");
        return 0;
    }
    pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
    pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);

InitWindowlessVMR(hWnd,pGraph,&pWLC); //创建一个窗体,hWnd表示这个窗体

pWLC->GetNativeVideoSize(&lWidth,&lHeight,NULL,NULL);//获得视频的大小

pWLC->SetVideoPosition(rcSrc,rcClient);//通过lWidth和lHeight获得源视频的区域,rcSrc表示希望显示的视频区域,rcClient表示在窗口的哪个区域显示视频。

//播放视频

HRESULT hr = pGraph->RenderFile(L"D://Program//DXSDK//Samples//Media//chicken.wmv", NULL);
    if (SUCCEEDED(hr))
    {
        // Run the graph.
        hr = pControl->Run();
        if (SUCCEEDED(hr))
        {
            // Wait for completion.
            long evCode;
            pEvent->WaitForCompletion(INFINITE, &evCode);

// Note: Do not use INFINITE in a real application, because it
            // can block indefinitely.
        }

}
    pWLC->Release();

pControl->Release();
    pEvent->Release();
    pGraph->Release();
    CoUninitialize();

如果不希望这个窗口被阻塞,将播放视频的代码放到一个工作线程中执行。

[DirectShow] DirectShow的窗口相关推荐

  1. directshow(directShow多个usb摄像头方案)

    DirectShow评价是什么? DirectShow评价编辑播放一个文件是一项相对简单的任务,不过对于像是从视频窗口接收特定窗口信息到创建特定filters,开发者会不断地遇到DirectShowA ...

  2. DirectShow编程(3.5) - 关于DirectShow - DirectShow中的事件通告

    3.5 DirectShow中的事件通告    这一节主要描述在directshow filter graph中事件是怎样发生的,以及应用程序如何接收事件通告并响应它们. 3.5.1 概述    一个 ...

  3. DirectShow编程(3.1)- 关于DirectShow - DirectShow体系概述

    3. 关于DirectShow 3.1. DirectShow体系概述     多媒体的难题     处理多媒体有几个主要的难题:     *多媒体流包含了巨大的数据量,而这些数据都必须非常快地被处理 ...

  4. 视频播放 via DirectShow

    视频播放 via DirectShow DirectShow 简介 DirectShow 播放视频 播放流程 播放代码 DShowPlayer::OpenFile 函数 DShowPlayer::In ...

  5. 基于DirectShow视频及图片捕获软件的开发(写的非常详细)在后几篇博客 我会更新

    我们知道目前很多工业相机的图像数据采集都是基于DirectShow的,常见的有映美精等.DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起 ...

  6. 音频转码 via DirectShow

    音频转码 via DirectShow DirectShow 简介 DirectShow 转码 Transcoding 流程图 Transcoding 代码 _initGraph 函数 _addEnc ...

  7. 音频视频解决方案:GStreamer/ffmpeg/ffdshow/directshow/vfw

    音频视频编程相关:GStreamer/ffmpeg/directshow/vfw linux和window下几种流行的音频视频编程框架作一个总结,防止自己迷惘,免于晕头转向. 一.GStreamer ...

  8. 在.NET中使用DirectShow

    下载源程序:[北方网通]  [电信或网通] [下载说明] 1.单击上面这个地址,打开下载页面. 2.点普通下载--等待30秒--点"下载"按钮--保存 摘要 这个实验性的代码展示了 ...

  9. 如何使用DirectShow驱动H264/H265格式输出的UVC摄像头

    免责声明:仅供研究讨论,未经确认,内容与提供之源码,严禁商用!!! 先提一些题外话,在微软关于DirectShow的官网上有如下说明: https://docs.microsoft.com/zh-cn ...

最新文章

  1. iOS转让app-您必须移除要转让的 App 的所有构建版本和测试员,并清除“测试信息”下的所有信息字段解决方案...
  2. 死信队列和延迟队列_在实践中使用延迟队列
  3. 湖北汽车工业学院c语言程序设计 汽车零部件采购管理程序,湖北汽车工业学院c语言课程设计实验报告(采购信息管理系统).docx...
  4. css文本省略(······)行高错位(bug)- 解决办法
  5. 轻量级的Canvas类库zrender使用笔记 :简单自定义图件开发
  6. php如何增加字段,php如何增加字段
  7. Spring Autowiring @Qualifier example
  8. mysql针对特定表不做binlog_MySQL笔记--主从复制
  9. 解决IDEA导入项目后无法运行的问题
  10. 计算机辅助求解如何做,计算机辅助求解一元高次方程.pdf
  11. 搞学术不完全指北【包括谷歌学术镜像、论文工具、Wiki、SCI-HUB文献下载、翻译等】
  12. 数据分析——Python内容学习【1】
  13. 蒙特卡洛思想(Monte Carlo思想)
  14. postgresql.conf log_rotation_size
  15. uniapp的uniapp navigateTo 点击无法跳转的问题
  16. 基于深度学习的聊天机器人
  17. Python-裁判文书网
  18. TCP3次握手为啥挥手却要4次,这下解释明白了
  19. OPENCV study
  20. 【SSM架构】博客系统开发(七)-登陆界面

热门文章

  1. 数据结构复习 ---- 邻接表
  2. Android修改字体大小
  3. HECTF2021 Reverse wp
  4. z-index细解:一个z-index的值很大为何却在一个很小的值下面?
  5. jquery php下拉列表,JQuery三级下拉菜单
  6. 实现图片中文的识别和获取图片上文字的坐标(java实现)
  7. 环境问题还是测试的老大难?
  8. Persist Security Info
  9. 微机原理和计算机组成原理一样吗_计算机组成原理(指令)
  10. AWS学习日志之SAA