在影片檔案中內嵌目錄
本主題示範如何建立目錄 (TOC) ,並將其內嵌在影片檔案中。 為了讓範例程式碼保持簡短,目錄非常簡單;它只包含一個專案,而且專案會填入最少的資訊。
若要建立目錄並將它內嵌在檔案中,您必須呼叫 CoCreateInstance來建立下列四個物件。
- TOC 專案
- TOC 專案清單
- 目錄
- TOC 剖析器
物件的類別識別碼是在 目錄剖析器的類別識別碼中提供。
首先,將描述影片檔案一部分的資訊填入 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 Entry List 物件。
- 建立 TOC 物件,並在其上取得 IToc 介面。
- 呼叫 IToc::AddEntryListByIndex,將您在步驟 3 中建立的 TOC Entry List 物件新增至 TOC 物件。
- 建立 TOC 剖析器物件,並在其上取得 ITocParser 介面。
- 呼叫 ITocParser::Init 來初始化 TOC Parser 物件,並將其與視訊檔案產生關聯。
- 呼叫 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;
}
相關主題