自動產生目錄
本主題示範如何使用 目錄產生器 (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 新增至篩選圖形。
注意
呼叫IGraphBuilder介面的AddSourceFilter方法,以建立 souce 篩選,並將其新增至圖形。
呼叫IGraphBuilder介面的Connect方法,以連接來源篩選和包裝函式篩選。
呼叫IGraphBuilder介面的Render方法來完成圖形。
執行圖形 (IMediaControl::Run) ,並等候它完成 (IMediaEvent::WaitForCompletion) 。
取得 DMO 篩選包裝函式上的 IPropertyStore 介面,並取得 MFPKEY_TOCGENERATOR_TOCREADY 屬性的值。 如有必要,請重複執行,直到目錄就緒為止。
使用 您的 IPropertyStore 介面來取得 MFPKEY_TOCGENERATOR_TOCOBJECT 屬性的值。 此屬性是 IToc 介面,代表自動產生的目錄。
下列程式碼示範自動產生目錄的程式。 此程式碼會使用三個 Helper 函式 (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();
}
}
相關主題