目次を自動的に生成する
このトピックでは、 目次ジェネレーター (TOC ジェネレーター) コンポーネントを使用して、ビデオ ファイルの目次を自動的に生成する方法について説明します。
TOC ジェネレーターは、DirectX メディア オブジェクト (DMO) です。 TOC ジェネレーター DMO を使用するには、ビデオ ファイルをソースとする DirectX フィルター グラフを作成します。 TOC ジェネレーター DMO をフィルター グラフに挿入し、グラフを実行します。 その後、自動的に生成された目次を TOC ジェネレーター DMO から取得できます。
次の手順では、手順について詳しく説明します。
CoCreateInstance を呼び出して Filter Graph オブジェクト (CLSID_FilterGraph) を作成し、IGraphBuilder インターフェイスを取得します。
CoCreateInstance を呼び出して DMO ラッパー フィルター オブジェクト (CLSID_DMOWrapperFilter) を作成し、IDMOWrapperFilter インターフェイスを取得します。
CLSID_CTocGeneratorDmoを DMO ラッパー フィルターの Init メソッドに渡します。 これにより、TOC ジェネレーター DMO が作成され、DMO ラッパー フィルターにラップされます。
IGraphBuilder インターフェイスの AddFilter メソッドを呼び出して、ラップされた TOC ジェネレーター DMO をフィルター グラフに追加します。
Note
IGraphBuilder はIFilterGraph から継承します。
IGraphBuilder インターフェイスの AddSourceFilter メソッドを呼び出して、リソース フィルターを作成し、グラフに追加します。
DMO ラッパー フィルターとソース フィルターのピンを列挙します。 これには、 IEnumPins インターフェイスと IPin インターフェイスの取得が含まれます。
IGraphBuilder インターフェイスの Connect メソッドを呼び出して、ソース フィルターとラッパー フィルターを接続します。
IGraphBuilder インターフェイスの Render メソッドを呼び出して、グラフを完成させます。
グラフ (IMediaControl::Run) を実行し、完了するまで待機します (IMediaEvent::WaitForCompletion)。
DMO フィルター ラッパーで IPropertyStore インターフェイスを取得し、 MFPKEY_TOCGENERATOR_TOCREADY プロパティの値を取得します。 必要に応じて、目次の準備ができるまで繰り返します。
IPropertyStore インターフェイスを使用して、MFPKEY_TOCGENERATOR_TOCOBJECT プロパティの値を取得します。 このプロパティは、自動的に生成された目次を表す IToc インターフェイスです。
次のコードは、目次を自動的に生成する手順を示しています。 このコードでは、このドキュメントの他のページに示されている 3 つのヘルパー関数 (BuildGraph、 RunGraphAndWait、 GetToc) を使用します。
#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();
}
}
関連トピック