自动生成目录

本主题演示如何使用 目录生成器 (目录生成器) 组件自动生成视频文件的目录。

TOC 生成器是 directX 媒体对象 (DMO) 。 若要使用 TOC 生成器 DMO,请生成一个将视频文件作为源的 DirectX 筛选器图。 将 TOC 生成器 DMO 插入筛选器图,然后运行该图。 然后,可以从 TOC 生成器 DMO 获取自动生成的目录。

以下过程更详细地介绍了这些步骤。

  1. 调用 CoCreateInstance 以创建 filter Graph 对象 (CLSID_FilterGraph) 并获取 IGraphBuilder 接口。

  2. 调用 CoCreateInstance 以 (CLSID_DMOWrapperFilter) 创建 DMO 包装器筛选器对象,并获取 IDMOWrapperFilter 接口。

  3. CLSID_CTocGeneratorDmo 传递给 DMO 包装器筛选器的 Init 方法。 这会创建一个 TOC 生成器 DMO 并将其包装在 DMO 包装器筛选器中。

  4. 调用 IGraphBuilder 接口的 AddFilter 方法,将包装的 TOC 生成器 DMO 添加到筛选器图。

    注意

    IGraphBuilder 继承自 IFilterGraph

     

  5. 调用 IGraphBuilder 接口的 AddSourceFilter 方法以创建 souce 筛选器并将其添加到图形中。

  6. 枚举 DMO 包装器筛选器和源筛选器上的引脚。 这涉及到获取 IEnumPins 接口和 IPin 接口。

  7. 通过调用 IGraphBuilder 接口的 Connect 方法连接源筛选器和包装器筛选器。

  8. 通过调用 IGraphBuilder 接口的 Render 方法完成图形。

  9. (IMediaControl::Run) 运行 图形,并等待它完成 (IMediaEvent::WaitForCompletion) 。

  10. 获取 DMO 筛选器包装器上的 IPropertyStore 接口,并获取 MFPKEY_TOCGENERATOR_TOCREADY 属性的值。 如有必要,请重复此操作,直到目录准备就绪。

  11. 使用 IPropertyStore 接口获取 MFPKEY_TOCGENERATOR_TOCOBJECT 属性的值。 此属性是表示自动生成的目录的 IToc 接口。

以下代码演示了自动生成目录的过程。 此代码使用三个帮助程序函数, (BuildGraphRunGraphAndWaitGetToc) ,这些函数显示在本文档的其他页面上。

#include <dshow.h>
#include <dmodshow.h>
#include <wmcodecdsp.h>
#include <dmoreg.h>
#include <propsys.h>
#include <propidl.h>
#include <initguid.h>

HRESULT GetToc(IDMOWrapperFilter* pWrap, IToc** ppToc);
HRESULT RunGraphAndWait(IGraphBuilder* pGraph);
HRESULT BuildGraph(IGraphBuilder* pGraph, IDMOWrapperFilter* pWrap);

WCHAR g_sourceFile[] = L"c:\\experiment\\Seattle.wmv";

void main()
{
   HRESULT hr = E_FAIL;
   hr = CoInitialize(NULL);

   if(SUCCEEDED(hr))
   {
      IGraphBuilder* pBuilder = NULL;
      hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, 
         IID_IGraphBuilder, (VOID**)&pBuilder);

      if(SUCCEEDED(hr))
      {
         IDMOWrapperFilter* pWrap = NULL;
         hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL, CLSCTX_INPROC, 
            IID_IDMOWrapperFilter, (VOID**)&pWrap);

         if(SUCCEEDED(hr))
         {
            hr = pWrap->Init(CLSID_CTocGeneratorDmo, DMOCATEGORY_VIDEO_EFFECT); 

            if(SUCCEEDED(hr))
            {
               hr = BuildGraph(pBuilder, pWrap);

               if(SUCCEEDED(hr))
               {
                  hr = RunGraphAndWait(pBuilder);

                  if(SUCCEEDED(hr))
                  {
                     IToc* pToc = NULL;
                     hr = GetToc(pWrap, &pToc);

                     if(SUCCEEDED(hr))
                     {
                        // Inspect the table of contents by calling IToc methods.

                        pToc->Release();
                        pToc = NULL;
                     }
                  }
               }
            }

            pWrap->Release();
            pWrap = NULL;
         }

         pBuilder->Release();
         pBuilder = NULL;
      }

      CoUninitialize();
   }
}

用于生成目录的 BuildGraph 函数

用于生成目录的 GetToc 函数

用于生成目录的 RunGraphAndWait 函数

目录分析程序编程指南