Automatisches Generieren eines Inhaltsverzeichnis
In diesem Thema wird veranschaulicht, wie Sie mithilfe der Inhaltsverzeichnis-Generator-Komponente (Table of Contents Generator, TOC Generator) automatisch ein Inhaltsverzeichnis für eine Videodatei generieren.
ToC Generator ist ein DirectX-Medienobjekt (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 das Diagramm aus. Sie können dann das automatisch generierte Inhaltsverzeichnis aus dem Inhaltsverzeichnis des Inhaltsverzeichnis-Generators DMO.
Im folgenden Verfahren werden die Schritte ausführlicher beschrieben.
Rufen Sie CoCreateInstance auf, um ein Filter-Graph -Objekt (CLSID _ FilterGraph) zu erstellen und eine IGraphBuilder-Schnittstelle zu erhalten.
Rufen Sie CoCreateInstance auf, um ein DMO WrapperFilter-Objekt (CLSID _ DMOWrapperFilter) zu erstellen und eine IDMOWrapperFilter-Schnittstelle zu erhalten.
Übergeben Sie CLSID _ CTocGeneratorDmo an die Init-Methode ihres DMO Wrapperfilters. Dadurch wird ein TOC Generator-DMO erstellt und in Ihren DMO Wrapperfilter umschlossen.
Rufen Sie die AddFilter-Methode Ihrer IGraphBuilder-Schnittstelle auf, um den umschlossenen TOC-Generator DMO Filterdiagramm hinzuzufügen.
Hinweis
IGraphBuilder erbt von IFilterGraph.
Rufen Sie die AddSourceFilter-Methode Ihrer IGraphBuilder-Schnittstelle auf, um einen Souce-Filter zu erstellen und dem Diagramm hinzuzufügen.
Aufzählen von Pins auf dem DMO Wrapperfilter und des Quellfilters. Dies umfasst das Abrufen von IEnumPins-Schnittstellen und IPin-Schnittstellen.
Verbinden Quellfilter und Wrapperfilter durch Aufrufen der Verbinden Ihrer IGraphBuilder-Schnittstelle.
Vervollständigen Sie das Diagramm, indem Sie die Render-Methode Ihrer IGraphBuilder-Schnittstelle aufrufen.
Führen Sie den Graphen (IMediaControl::Run) aus, und warten Sie, bis er abgeschlossen ist (IMediaEvent::WaitForCompletion).
Abrufen einer IPropertyStore-Schnittstelle für ihren DMO-Filter-Wrapper und Abrufen des Werts der MFPKEY _ TOCGENERATOR _ TOCREADY-Eigenschaft. Wiederholen Sie den Vorgang bei Bedarf, bis das Inhaltsverzeichnis bereit ist.
Verwenden Sie Ihre IPropertyStore-Schnittstelle, um den Wert der MFPKEY _ TOCGENERATOR _ TOCOBJECT-Eigenschaft zu erhalten. Diese Eigenschaft ist eine IToc-Schnittstelle, die das automatisch generierte Inhaltsverzeichnis darstellt.
Der folgende Code veranschaulicht das Verfahren zum automatischen Generieren eines Inhaltsverzeichnis. Der Code verwendet drei Hilfsfunktionen (BuildGraph, RunGraphAndWaitund 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();
}
}