转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件使用 >> 常用软件 >> 正文
DirectShow入门之Directshow的基本技巧         

DirectShow入门之Directshow的基本技巧

作者:闵涛 文章来源:闵涛的学习笔记 点击数:794 更新时间:2009/4/24 22:47:29
作者:智慧的鱼

  摘要:本文主要讲述了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);


[Web开发]JSP入门学习经验总结  [网络安全]安全知识:堵住黑客非法入侵的11点重要基本原则
[Web开发]ASP中最基本的最常用的四个SQL语句  [平面设计]Flash动作脚本Actiong之基本脚本及其他脚本全集
[平面设计]Flash动画制作之基本命令介绍  [网页制作]搜索引擎的基本工作原理
[办公软件]Excel工作表基本编辑操作大总结(输入、删除、移动…  [操作系统]BIOS(基本输入输出系统)开机自检的中文解释
[操作系统]掌握基本输入输出系统CMOS的使用及维护知识  [网络技术]交换机基本命令的详解
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · 办公软件  · 系统软件
    · 常用软件  · 聊天工具
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台