[DirectShow] DirectShow的窗口
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的窗口相关推荐
- directshow(directShow多个usb摄像头方案)
DirectShow评价是什么? DirectShow评价编辑播放一个文件是一项相对简单的任务,不过对于像是从视频窗口接收特定窗口信息到创建特定filters,开发者会不断地遇到DirectShowA ...
- DirectShow编程(3.5) - 关于DirectShow - DirectShow中的事件通告
3.5 DirectShow中的事件通告 这一节主要描述在directshow filter graph中事件是怎样发生的,以及应用程序如何接收事件通告并响应它们. 3.5.1 概述 一个 ...
- DirectShow编程(3.1)- 关于DirectShow - DirectShow体系概述
3. 关于DirectShow 3.1. DirectShow体系概述 多媒体的难题 处理多媒体有几个主要的难题: *多媒体流包含了巨大的数据量,而这些数据都必须非常快地被处理 ...
- 视频播放 via DirectShow
视频播放 via DirectShow DirectShow 简介 DirectShow 播放视频 播放流程 播放代码 DShowPlayer::OpenFile 函数 DShowPlayer::In ...
- 基于DirectShow视频及图片捕获软件的开发(写的非常详细)在后几篇博客 我会更新
我们知道目前很多工业相机的图像数据采集都是基于DirectShow的,常见的有映美精等.DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起 ...
- 音频转码 via DirectShow
音频转码 via DirectShow DirectShow 简介 DirectShow 转码 Transcoding 流程图 Transcoding 代码 _initGraph 函数 _addEnc ...
- 音频视频解决方案:GStreamer/ffmpeg/ffdshow/directshow/vfw
音频视频编程相关:GStreamer/ffmpeg/directshow/vfw linux和window下几种流行的音频视频编程框架作一个总结,防止自己迷惘,免于晕头转向. 一.GStreamer ...
- 在.NET中使用DirectShow
下载源程序:[北方网通] [电信或网通] [下载说明] 1.单击上面这个地址,打开下载页面. 2.点普通下载--等待30秒--点"下载"按钮--保存 摘要 这个实验性的代码展示了 ...
- 如何使用DirectShow驱动H264/H265格式输出的UVC摄像头
免责声明:仅供研究讨论,未经确认,内容与提供之源码,严禁商用!!! 先提一些题外话,在微软关于DirectShow的官网上有如下说明: https://docs.microsoft.com/zh-cn ...
最新文章
- iOS转让app-您必须移除要转让的 App 的所有构建版本和测试员,并清除“测试信息”下的所有信息字段解决方案...
- 死信队列和延迟队列_在实践中使用延迟队列
- 湖北汽车工业学院c语言程序设计 汽车零部件采购管理程序,湖北汽车工业学院c语言课程设计实验报告(采购信息管理系统).docx...
- css文本省略(······)行高错位(bug)- 解决办法
- 轻量级的Canvas类库zrender使用笔记 :简单自定义图件开发
- php如何增加字段,php如何增加字段
- Spring Autowiring @Qualifier example
- mysql针对特定表不做binlog_MySQL笔记--主从复制
- 解决IDEA导入项目后无法运行的问题
- 计算机辅助求解如何做,计算机辅助求解一元高次方程.pdf
- 搞学术不完全指北【包括谷歌学术镜像、论文工具、Wiki、SCI-HUB文献下载、翻译等】
- 数据分析——Python内容学习【1】
- 蒙特卡洛思想(Monte Carlo思想)
- postgresql.conf log_rotation_size
- uniapp的uniapp navigateTo 点击无法跳转的问题
- 基于深度学习的聊天机器人
- Python-裁判文书网
- TCP3次握手为啥挥手却要4次,这下解释明白了
- OPENCV study
- 【SSM架构】博客系统开发(七)-登陆界面