Freigeben über


Automatisches Generieren eines Inhaltsverzeichnisses

In diesem Thema wird veranschaulicht, wie Sie mithilfe der Inhaltsverzeichnis-Generator-Komponente (TOC-Generator) automatisch ein Inhaltsverzeichnis für eine Videodatei generieren.

Der TOC-Generator ist ein DirectX Media Object (DMO). Um den TOC-Generator-DMO zu verwenden, erstellen Sie ein DirectX-Filterdiagramm, das eine Videodatei als Quelle enthält. Fügen Sie den TOC-Generator-DMO in das Filterdiagramm ein, und führen Sie den Graphen aus. Anschließend können Sie das automatisch generierte Inhaltsverzeichnis aus dem ToC-Generator-DMO abrufen.

Im folgenden Verfahren werden die Schritte ausführlicher beschrieben.

  1. Rufen Sie CoCreateInstance auf, um ein Filter Graph-Objekt (CLSID_FilterGraph) zu erstellen und eine IGraphBuilder-Schnittstelle abzurufen.

  2. Rufen Sie CoCreateInstance auf, um ein DMO Wrapper Filter-Objekt (CLSID_DMOWrapperFilter) zu erstellen und eine IDMOWrapperFilter-Schnittstelle abzurufen.

  3. Übergeben Sie CLSID_CTocGeneratorDmo an die Init-Methode Ihres DMO-Wrapperfilters. Dadurch wird ein TOC-Generator-DMO erstellt und in Ihren DMO-Wrapperfilter eingeschlossen.

  4. Rufen Sie die AddFilter-Methode Ihrer IGraphBuilder-Schnittstelle auf, um den umschlossenen TOC-Generator-DMO zum Filterdiagramm hinzuzufügen.

    Hinweis

    IGraphBuilder erbt von IFilterGraph.

     

  5. Rufen Sie die AddSourceFilter-Methode Ihrer IGraphBuilder-Schnittstelle auf, um einen Souce-Filter zu erstellen und dem Diagramm hinzuzufügen.

  6. Auflisten von Pins für den DMO-Wrapperfilter und den Quellfilter. Dies umfasst das Abrufen von IEnumPins-Schnittstellen und IPin-Schnittstellen .

  7. Verbinden Sie den Quellfilter und den Wrapperfilter, indem Sie die Connect-Methode Ihrer IGraphBuilder-Schnittstelle aufrufen.

  8. Vervollständigen Sie das Diagramm, indem Sie die Render-Methode Ihrer IGraphBuilder-Schnittstelle aufrufen.

  9. Führen Sie das Diagramm aus (IMediaControl::Run), und warten Sie, bis es abgeschlossen ist (IMediaEvent::WaitForCompletion).

  10. Rufen Sie eine IPropertyStore-Schnittstelle auf Ihrem DMO-Filterwrapper ab, und rufen Sie den Wert der MFPKEY_TOCGENERATOR_TOCREADY-Eigenschaft ab. Wiederholen Sie dies bei Bedarf, bis das Inhaltsverzeichnis bereit ist.

  11. Verwenden Sie Ihre IPropertyStore-Schnittstelle , um den Wert der MFPKEY_TOCGENERATOR_TOCOBJECT-Eigenschaft abzurufen. Diese Eigenschaft ist eine IToc-Schnittstelle , die das automatisch generierte Inhaltsverzeichnis darstellt.

Der folgende Code veranschaulicht das Verfahren zum automatischen Generieren eines Inhaltsverzeichnisses. Der Code verwendet drei Hilfsfunktionen (BuildGraph, RunGraphAndWait und GetToc), die auf anderen Seiten dieser Dokumentation angezeigt werden.

#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-Funktion zum Generieren eines Inhaltsverzeichnisses

GetToc-Funktion zum Generieren eines Inhaltsverzeichnisses

RunGraphAndWait-Funktion zum Generieren eines Inhaltsverzeichnisses

Inhaltsverzeichnis: Parser-Programmierhandbuch