没有合适的资源?快使用搜索试试~ 我知道了~
首页DirectShow入门之Directshow的基本技巧
DirectShow入门之Directshow的基本技巧
需积分: 9 47 浏览量
更新于2023-05-27
评论
收藏 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
- 粉丝: 92
- 资源: 49
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助

会员权益专享
最新资源
- ARM Cortex-A(armV7)编程手册V4.0.pdf
- ABB机器人保养总结解析.ppt
- 【超详细图解】菜鸡如何理解双向链表的python代码实现
- 常用网络命令的使用 ipconfig ping ARP FTP Netstat Route Tftp Tracert Telnet nslookup
- 基于单片机控制的DC-DC变换电路
- RS-232接口电路的ESD保护.pdf
- linux下用time(NULL)函数和localtime()获取当前时间的方法
- Openstack用户使用手册.docx
- KUKA KR 30 hA,KR 60 hA机器人产品手册.pdf
- Java programming with JNI
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制

评论0