本主题演示如何使用 目录生成器 (TOC 生成器)组件自动生成视频文件的目录。
TOC 生成器是 DirectX 媒体对象(DMO)。 若要使用 TOC 生成器 DMO,请生成一个 DirectX 筛选器图,其中包含视频文件作为其源。 将 TOC Generator 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 添加到筛选器图。
注释
调用 IGraphBuilder 接口的 AddSourceFilter 方法以创建源筛选器并将其添加到图形。
通过调用 IGraphBuilder 接口的 Connect 方法连接源筛选器和包装筛选器。
通过调用 IGraphBuilder 接口的 Render 方法完成图形。
运行图形(IMediaControl::Run),并等待它完成(IMediaEvent::WaitForCompletion)。
获取 DMO 筛选器包装器上的 IPropertyStore 接口,并获取 MFPKEY_TOCGENERATOR_TOCREADY 属性的值。 如有必要,请重复该操作,直到目录就绪。
使用 IPropertyStore 接口获取 MFPKEY_TOCGENERATOR_TOCOBJECT 属性的值。 此属性是一个 IToc 接口,表示自动生成的目录。
以下代码演示了自动生成目录的过程。 该代码使用本文档其他页面上显示的三个帮助程序函数(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();
}
}
相关主题