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


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

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

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

Используйте методы ITocEntry для проверки отдельной записи в оглавлении. Например, можно проверить заголовок, время начала и время окончания записи.

В следующем списке приведены более подробные инструкции.

  1. Вызовите CoCreateInstance , чтобы создать объект средства синтаксического анализа оглавлений и получить интерфейс ITocParser .
  2. Вызовите метод ITocParser::Init , чтобы инициализировать средство синтаксического анализа оглавлений и связать его с видеофайлом.
  3. Получите интерфейс IToc , вызвав ITocParser::GetTocByIndex.
  4. Получите интерфейс ITocEntryList , вызвав метод IToc::GetEntryListByIndex.
  5. Получите интерфейс ITocEntry , вызвав ITocEntryList::GetEntryByIndex.
  6. Выделение структуры TOC_ENTRY_DESCRIPTOR .
  7. Заполните структуру TOC_ENTRY_DESCRIPTOR , вызвав ITocEntry::GetDescriptor.

В следующем коде показаны шаги, описанные в предыдущем списке.

#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;
}

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

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

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