Внедрение оглавления в видеофайл
В этом разделе показано, как создать оглавление и внедрить его в видеофайл. Чтобы сохранить пример кода коротким, оглавление очень простое; он содержит только одну запись, и запись заполняется минимальным количеством сведений.
Чтобы создать оглавление и внедрить его в файл, необходимо создать следующие четыре объекта, вызвав CoCreateInstance.
- Запись оглавления
- Список записей оглавления
- ОГЛАВЛЕНИЕ
- Средство синтаксического анализа оглавлений
Идентификаторы классов для объектов предоставляются в разделе Идентификаторы классов для средства синтаксического анализа оглавлений.
Сначала заполните запись оглавления сведениями, описывающими одну часть видеофайла. Добавьте запись оглавления в список записей оглавления, а затем добавьте список записей оглавления в оглавления. Наконец, добавьте оглавления в средство синтаксического анализа оглавления, которое предоставляет функциональные возможности для внедрения оглавления в видеофайл. В следующем списке приведены инструкции более подробно.
- Создайте объект TOC Entry и получите для него интерфейс ITocEntry .
- Заполните структуру TOC_ENTRY_DESCRIPTOR и передайте ее в ITocEntry::SetDescriptor.
- Создайте объект списка записей оглавления и получите интерфейс ITocEntryList .
- Добавьте объект TOC Entry, созданный на шаге 1, в объект Списка записей оглавления, вызвав ITocEntryList::AddEntryByIndex.
- Создайте объект TOC и получите для него интерфейс IToc .
- Добавьте объект списка записей оглавления, созданный на шаге 3, в объект TOC, вызвав метод IToc::AddEntryListByIndex.
- Создайте объект средства синтаксического анализа оглавлений и получите интерфейс ITocParser .
- Вызовите ITocParser::Init , чтобы инициализировать объект средства синтаксического анализа оглавлений и связать его с видеофайлом.
- Добавьте объект TOC, созданный на шаге 5, в объект Parser TOC, вызвав ITocParser::AddToc.
- Внедрите оглавление в видеофайл, вызвав 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;
}
Связанные темы