没有合适的资源?快使用搜索试试~ 我知道了~
首页DirectShow入门之Directshow的基本技巧
DirectShow入门之Directshow的基本技巧
需积分: 9 59 下载量 156 浏览量
更新于2023-03-16
评论
收藏 110KB DOC 举报
DirectShow入门之Directshow的基本技巧.doc DirectShow入门之Directshow的基本技巧.doc
资源详情
资源评论
资源推荐
作者:智慧的鱼
摘要:本文主要讲述了 Directshow 开发的一些基本概念和技巧,主要内容如下:
1、视频播放(Video Rendering)
2、如何处理事件通知(Event Notification)
3 、如何枚举系统的设备和过虑器
4、如何枚举 Graph 图中的对象(filter,pin )
5、Seeking Filter graph
6、如何设置 Graph 时钟(Setting Graph Clock )
视频播放(Video Rendering)
dshow 的视频提交过滤器可以在窗口模式和无窗口模式下工作。在窗口模式下,过滤器创
建一个自己的窗口,在里面播放视频。在无窗口模式下,过滤器直接将视频在应用程序提供的
窗口上显示,过滤器本身不创建窗口。
窗口模式
在窗口模式下,视频提交过滤器创建一个窗口,然后将视频祯帖到窗口上,你可以将这个
窗口帖到你的应用程序的窗口。
Video Renderer 只支持窗口模式,VMR-7 and VMR-9 缺省的是窗口模式,也支持无窗口模
式。
为了在你的应用程序中显示视频,你可以将视频窗口设置成应用程序的子窗口。你可以通
过
IVideoWindow *pVidWin = NULL;
pGraph->QueryInterface(IID_IVideoWindow, (void **)&g_pVidWin);
pVidWin->put_Owner((OAHWND)hwnd);
pVidWin->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
RECT grc;
GetClientRect(hwnd, &grc);
pVidWin->SetWindowPosition(0, 0, grc.right, grc.bottom);
结束时一定要清理现场:
pControl->Stop();
pVidWin->put_Visible(OAFALSE);
pVidWin->put_Owner(NULL);
无窗口模式
当采用无窗口的模式时,就没有必要暴露 IVideoWindow 接口了。
为了能够使用 VMR 的缺省行为,在构建 Graph 图之前必须要调整 VMR。
1、创建一个过虑器图表管理器
2、创建一个 VMR,加入到 graph 中
3、调用 VMR 的 IVMRFilterConfig::SetRenderingMode 方法设置 VMRMode_Windowless
标志。
4、调用 IVMRWindowlessControl::SetVideoClippingWindow 给视频指定一个显示窗口。
然后调用 IGraphBuilder::RenderFile 或者其他的方法来创建其他的 Graph。
下面的代码显示了如何创建一个 VMR,将其添加到 Graph,如何设置无窗口模式
HRESULT InitWindowlessVMR(
HWND hwndApp, // Window to hold the video.
IGraphBuilder* pGraph, // Pointer to the Filter Graph Manager.
IVMRWindowlessControl** ppWc, // Receives a pointer to the VMR. )
{
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;
}
你也可以调用下面的函数
IVMRWindowlessControl *pWc = NULL;
hr = InitWindowlessVMR(hwnd, pGraph, &g_pWc);
if (SUCCEEDED(hr))
{
// Build the graph. For example:
pGraph->RenderFile(wszMyFileName, 0);
// Release the VMR interface when you are done.
pWc->Release();
}
下面看看如何设置视频的位置
有两个矩形需要考虑,一个是源矩形,一个是目的矩形。源矩形决定开始播放视频的位
置,目的矩形决定在窗口显示视频的区域。VMR 将源矩形按照目的矩形的大小进行扩展。
IVMRWindowlessControl::SetVideoPosition 可以设置两个矩形的大小,源矩形必须小于等
于本地视频大小。你可以通过 IVMRWindowlessControl::GetNativeVideoSize 获取本地的视频
区域大小。
// Find the native video size.
long lWidth, lHeight;
HRESULT hr = g_pWc->GetNativeVideoSize(&lWidth, &lHeight, NULL, NULL);
if (SUCCEEDED(hr))
{
RECT rcSrc, rcDest;
// Set the source rectangle.
SetRect(&rcSrc, 0, 0, lWidth/2, lHeight/2);
// Get the window client area.
GetClientRect(hwnd, &rcDest);
// Set the destination rectangle.
SetRect(&rcDest, 0, 0, rcDest.right/2, rcDest.bottom/2);
// Set the video position.
hr = g_pWc->SetVideoPosition(&rcSrc, &rcDest);
处理窗口消息
因为 VMR 没有自己的窗口,所以当视频需要重画或者改变的时候你要通知它。
1、当你接到一个 WM_PAINT 消息,你就要调用 IVMRWindowlessControl::RepaintVideo
来重画视频
2、当你接到一个 WM_DISPLAYCHANGE 消息,你就要调用
IVMRWindowlessControl::DisplayModeChanged.
3、当你接到一个 WM_SIZE 消息时,重新计算视频的位置,然后调用 SetVideoPostion。
下面的代码演示了 WM_PAINT 消息的处理:
void OnPaint(HWND hwnd)
{
PAINTSTRUCT ps;
HDC hdc;
RECT rcClient;
GetClientRect(hwnd, &rcClient);
hdc = BeginPaint(hwnd, &ps);
if (g_pWc != NULL)
{
// Find the region where the application can paint by subtracting
// the video destination rectangle from the client area.
剩余15页未读,继续阅读
braveyly
- 粉丝: 94
- 资源: 49
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
- SPC统计方法基础知识.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0