Поделиться через


Внедрение оглавления в видеофайл

В этом разделе показано, как создать оглавление и внедрить его в видеофайл. Чтобы сохранить пример кода коротким, оглавление очень простое; он содержит только одну запись, и запись заполняется минимальным количеством сведений.

Чтобы создать оглавление и внедрить его в файл, необходимо создать следующие четыре объекта, вызвав CoCreateInstance.

  • Запись оглавления
  • Список записей оглавления
  • ОГЛАВЛЕНИЕ
  • Средство синтаксического анализа оглавлений

Идентификаторы классов для объектов предоставляются в разделе Идентификаторы классов для средства синтаксического анализа оглавлений.

Сначала заполните запись оглавления сведениями, описывающими одну часть видеофайла. Добавьте запись оглавления в список записей оглавления, а затем добавьте список записей оглавления в оглавления. Наконец, добавьте оглавления в средство синтаксического анализа оглавления, которое предоставляет функциональные возможности для внедрения оглавления в видеофайл. В следующем списке приведены инструкции более подробно.

  1. Создайте объект TOC Entry и получите для него интерфейс ITocEntry .
  2. Заполните структуру TOC_ENTRY_DESCRIPTOR и передайте ее в ITocEntry::SetDescriptor.
  3. Создайте объект списка записей оглавления и получите интерфейс ITocEntryList .
  4. Добавьте объект TOC Entry, созданный на шаге 1, в объект Списка записей оглавления, вызвав ITocEntryList::AddEntryByIndex.
  5. Создайте объект TOC и получите для него интерфейс IToc .
  6. Добавьте объект списка записей оглавления, созданный на шаге 3, в объект TOC, вызвав метод IToc::AddEntryListByIndex.
  7. Создайте объект средства синтаксического анализа оглавлений и получите интерфейс ITocParser .
  8. Вызовите ITocParser::Init , чтобы инициализировать объект средства синтаксического анализа оглавлений и связать его с видеофайлом.
  9. Добавьте объект TOC, созданный на шаге 5, в объект Parser TOC, вызвав ITocParser::AddToc.
  10. Внедрите оглавление в видеофайл, вызвав 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;
}

Чтение оглавление из видеофайла

Объекты средства синтаксического анализа оглавлений

Руководство по программированию средства синтаксического анализа оглавлений