共用方式為


自動產生目錄

本主題示範如何使用 目錄產生器 (TOC 產生器) 元件自動產生視訊檔案的目錄。

TOC 產生器是 DirectX 媒體物件 (DMO) 。 若要使用 TOC 產生器 DMO,請建置具有視訊檔案作為其來源的 DirectX 篩選圖形。 將 TOC 產生器 DMO 插入篩選圖形,然後執行圖形。 然後,您可以從 TOC 產生器 DMO 取得自動產生的目錄。

下列程式提供更詳細的步驟。

  1. 呼叫 CoCreateInstance 以建立 Filter Graph 物件, (CLSID_FilterGraph) 並取得 IGraphBuilder 介面。

  2. 呼叫 CoCreateInstance 以建立 DMO 包裝函式篩選物件, (CLSID_DMOWrapperFilter) 並取得 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 介面,代表自動產生的目錄。

下列程式碼示範自動產生目錄的程式。 此程式碼會使用三個 Helper 函式 (BuildGraph、RunGraphAndWaitGetToc) ,這些函式會顯示在此檔的其他頁面上。

#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 函式

目錄剖析器程式設計手冊