天天看点

(DirectX系列03)DirectShow简单媒体文件播放

    Directshow SDK提供了一种开放的开发环境,开发人员可以根据自己的需要制定各种组件。Directshow使用一种滤波器链表(Filter Graph)的模型来管理整个数据流的处理流程,每个部分都是COM组件,形成模块化,参与数据处理的模块就是滤波器(Filter)。

     上几周学习DirectSound做了些总结,今天开始学习DirectShow今天主要介绍一个简单的媒体文件播放的程序。

     首先来介绍下DirectShow的环境搭建,其实环境的搭建并不是很难,但是下载SDK确实发费了不少时间。现在来做一个总结,经过测试下载dxsdk_feb2005_extras.exe软件是正确的,将这个文件解压到制定的目录,会出现Directshow和Directsound两个目录,再将这两个目录拷贝到F:/Microsoft DirectX SDK (February 2010)目录(即DX安装目录),这样的话就基本上配置好环境了。但是在工程里面还需要附加文件目录和LIB目录,这里就不详细介绍了,如下来介绍简单的代码,这部分代码来自《VC++音频/视频处理技术及工程实践》书中。

      创建过滤器管理器

IGraphBuilder *pGraph = NULL;

hr=CoCreateInstance(CLSID_FilterGraph, NULL,CLSCTX_INPROC_SERVER,

                               IID_IGraphBuilder, (void **)&pGraph);

    查询媒体控制器和媒体事件接口

hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);

hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);

    开始播放

hr = pGraph->RenderFile(L"D://DXSDK//Samples//Media//ruby.avi", NULL);

  if (SUCCEEDED(hr))

  {

      // 运行图表.

      hr = pControl->Run();

      if (SUCCEEDED(hr))

      {

          //等待回放结束事件.

          long evCode;

          pEvent->WaitForCompletion(INFINITE, &evCode);

         // 切记: 在实际应用当中,不能使用INFINITE标识, 因为它会不确定的阻塞程序

      }

  }