ビデオ ファイルからの目次の読み取り
このトピックでは、ビデオ ファイルに既に埋め込まれている目次を読み取る方法について説明します。
まず 、CoCreateInstance を呼び出して TOC パーサー オブジェクトを作成し、 ITocParser インターフェイスを 取得します。 次に、メソッドを呼び出して次のインターフェイスを取得します。
ITocEntry のメソッドを使用して、目次の個々のエントリを検査します。 たとえば、エントリのタイトル、開始時刻、終了時刻を調べることができます。
次の一覧では、手順の詳細を示します。
- CoCreateInstance を呼び出して TOC パーサー オブジェクトを作成し、その上に ITocParser インターフェイスを取得します。
- ITocParser::Init を呼び出して TOC パーサーを初期化し、ビデオ ファイルに関連付けます。
- ITocParser::GetTocByIndex を呼び出して IToc インターフェイスを取得します。
- IToc::GetEntryListByIndex を呼び出して ITocEntryList インターフェイスを取得します。
- ITocEntryList::GetEntryByIndex を呼び出して ITocEntry インターフェイスを取得します。
- TOC_ENTRY_DESCRIPTOR構造体を割り当てます。
- ITocEntry::GetDescriptor を呼び出して、TOC_ENTRY_DESCRIPTOR構造体を設定します。
次のコードは、前の一覧の手順を示しています。
#include <stdio.h>
#include <wmcodecdsp.h>
HRESULT ShowEntryInfo(ITocEntry* pEntry);
void main()
{
HRESULT hr = CoInitialize(NULL);
if(SUCCEEDED(hr))
{
ITocParser* pTocParser = NULL;
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))
{
IToc* pToc = NULL;
hr = pTocParser->GetTocByIndex(TOC_POS_TOPLEVELOBJECT, 0, &pToc);
if(SUCCEEDED(hr))
{
ITocEntryList* pEntryList = NULL;
hr = pToc->GetEntryListByIndex(0, &pEntryList);
if(SUCCEEDED(hr))
{
ITocEntry* pEntry = NULL;
hr = pEntryList->GetEntryByIndex(0, &pEntry);
if(SUCCEEDED(hr))
{
hr = ShowEntryInfo(pEntry);
pEntry->Release();
pEntry = NULL;
}
pEntryList->Release();
pEntryList = NULL;
}
pToc->Release();
pToc = NULL;
}
}
pTocParser->Release();
pTocParser = NULL;
}
CoUninitialize();
}
}
HRESULT ShowEntryInfo(ITocEntry* pEntry)
{
HRESULT hr = E_FAIL;
TOC_ENTRY_DESCRIPTOR entryDesc = {0};
hr = pEntry->GetDescriptor(&entryDesc);
if(SUCCEEDED(hr))
{
printf_s("qwStartTime: %x\n", entryDesc.qwStartTime);
printf_s("qwEndTime: %x\n", entryDesc.qwEndTime);
printf_s("qwStartStartPacketOffset: %x\n", entryDesc.qwStartPacketOffset);
printf_s("qwEndPacketOffset: %x\n", entryDesc.qwEndPacketOffset);
printf_s("qwRepresentativeFrameTime: %x\n", entryDesc.qwRepresentativeFrameTime);
}
return hr;
}
関連トピック