Share via


Lendo um sumário de um arquivo de vídeo

Este tópico demonstra como ler um sumário que já foi inserido em um arquivo de vídeo.

Comece chamando CoCreateInstance para criar um objeto TOC Parser e obter uma interface ITocParser . Em seguida, obtenha as interfaces a seguir chamando métodos.

Use os métodos de ITocEntry para inspecionar uma entrada individual no sumário. Por exemplo, você pode inspecionar o título, a hora de início e a hora de término da entrada.

A lista a seguir fornece as etapas com mais detalhes.

  1. Chame CoCreateInstance para criar um objeto TOC Parser e obter uma interface ITocParser nele.
  2. Chame ITocParser::Init para inicializar o analisador TOC e associá-lo a um arquivo de vídeo.
  3. Obtenha uma interface IToc chamando ITocParser::GetTocByIndex.
  4. Obtenha uma interface ITocEntryList chamando IToc::GetEntryListByIndex.
  5. Obtenha uma interface ITocEntry chamando ITocEntryList::GetEntryByIndex.
  6. Alocar uma estrutura de TOC_ENTRY_DESCRIPTOR .
  7. Preencha a estrutura TOC_ENTRY_DESCRIPTOR chamando ITocEntry::GetDescriptor.

O código a seguir demonstra as etapas na lista anterior.

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

Inserindo um sumário em um arquivo de vídeo

Objetos do Analisador de Sumário

Guia de Programação do Analisador de Sumário