ビデオ ファイルに目次を埋め込む
このトピックでは、目次 (TOC) を作成し、ビデオ ファイルに埋め込む方法について説明します。 コード例を短く保つために、目次は非常に単純です。エントリは 1 つだけ含まれており、エントリには最小限の情報が設定されます。
目次を作成してファイルに埋め込むには、 CoCreateInstance を呼び出して次の 4 つのオブジェクトを作成する必要があります。
- TOC エントリ
- TOC エントリ リスト
- 目次
- TOC パーサー
オブジェクトのクラス識別子は、 目次パーサーのクラス識別子で指定されます。
まず、ビデオ ファイルの 1 つの部分を説明する情報を TOC エントリに入力します。 TOC エントリを TOC エントリ リストに追加し、TOC エントリ リストを TOC に追加します。 最後に、TOC を TOC パーサーに追加します。これにより、ビデオ ファイルに TOC を埋め込む機能が提供されます。 次の一覧では、手順の詳細を示します。
- TOC Entry オブジェクトを作成し、その上に ITocEntry インターフェイスを取得します。
- TOC_ENTRY_DESCRIPTOR構造体を設定し、ITocEntry::SetDescriptor に渡します。
- TOC Entry List オブジェクトを作成し、その上に ITocEntryList インターフェイスを取得します。
- ITocEntryList::AddEntryByIndex を呼び出して、手順 1 で作成した TOC Entry オブジェクトを TOC エントリ リスト オブジェクトに追加します。
- TOC オブジェクトを作成し、その上に IToc インターフェイスを取得します。
- IToc::AddEntryListByIndex を呼び出して、手順 3 で作成した TOC エントリ リスト オブジェクトを TOC オブジェクトに追加します。
- TOC パーサー オブジェクトを作成し、その上に ITocParser インターフェイスを 取得します。
- ITocParser::Init を呼び出して TOC パーサー オブジェクトを初期化し、ビデオ ファイルに関連付けます。
- ITocParser::AddToc を呼び出して、手順 5 で作成した TOC オブジェクトを TOC パーサー オブジェクトに追加します。
- ITocParser::Commit を呼び出して、目次をビデオ ファイルに埋め込みます。
次のコードは、前の一覧で示した手順を示しています。
#include <wmcodecdsp.h>
HRESULT InitTocParserAndCommit(IToc* pToc);
void main()
{
HRESULT hr = CoInitialize(NULL);
if(SUCCEEDED(hr))
{
ITocEntry* pEntry = NULL;
hr = CoCreateInstance(CLSID_CTocEntry, NULL,
CLSCTX_INPROC_SERVER, IID_ITocEntry, (VOID**)&pEntry);
if(SUCCEEDED(hr))
{
TOC_ENTRY_DESCRIPTOR tocDesc = {0};
tocDesc.qwStartTime = 4;
tocDesc.qwEndTime = 8;
pEntry->SetDescriptor(&tocDesc); // HRESULT ignored for simplicity.
ITocEntryList* pEntryList = NULL;
hr = CoCreateInstance(CLSID_CTocEntryList, NULL,
CLSCTX_INPROC_SERVER, IID_ITocEntryList, (VOID**)&pEntryList);
if(SUCCEEDED(hr))
{
pEntryList->AddEntryByIndex(0, pEntry); // HRESULT ignored.
IToc* pToc = NULL;
hr = CoCreateInstance(CLSID_CToc, NULL,
CLSCTX_INPROC_SERVER, IID_IToc, (VOID**)&pToc);
if(SUCCEEDED(hr))
{
pToc->AddEntryListByIndex(0, pEntryList); // HRESULT ignored.
hr = InitTocParserAndCommit(pToc);
}
}
}
CoUninitialize();
}
}
HRESULT InitTocParserAndCommit(IToc* pToc)
{
ITocParser* pTocParser = NULL;
HRESULT hr = CoCreateInstance(CLSID_CTocParser, NULL,
CLSCTX_INPROC_SERVER, IID_ITocParser, (VOID**)&pTocParser);
if(SUCCEEDED(hr))
{
hr = pTocParser->Init(L"\\\\?\\c:\\experiment\\seattle.wmv");
if(SUCCEEDED(hr))
{
DWORD tocIndex = 0;
hr = pTocParser->AddToc(TOC_POS_TOPLEVELOBJECT, pToc, &tocIndex);
if(SUCCEEDED(hr))
{
hr = pTocParser->Commit();
}
}
pTocParser->Release();
pTocParser = NULL;
}
return hr;
}
関連トピック