Compartilhar via


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

Este tópico demonstra como criar um sumário (TOC) e inserê-lo em um arquivo de vídeo. Para manter o código de exemplo curto, o sumário é muito simples; ele contém apenas uma entrada e a entrada é preenchida com um mínimo de informações.

Para criar um sumário e inserê-lo em um arquivo, você deve criar os quatro objetos a seguir chamando CoCreateInstance.

  • Entrada TOC
  • Lista de Entradas do TOC
  • SUMÁRIO
  • Analisador de TOC

Os identificadores de classe para os objetos são fornecidos em Identificadores de Classe para o Analisador de Sumário.

Primeiro, preencha a entrada TOC com informações que descrevem uma parte do arquivo de vídeo. Adicione a entrada TOC à lista de entradas do TOC e adicione a lista de entradas TOC ao TOC. Por fim, adicione o TOC ao analisador TOC, que fornece a funcionalidade para inserir o TOC no arquivo de vídeo. A lista a seguir fornece as etapas com mais detalhes.

  1. Crie um objeto De entrada TOC e obtenha uma interface ITocEntry nele.
  2. Preencha uma estrutura TOC_ENTRY_DESCRIPTOR e passe-a para ITocEntry::SetDescriptor.
  3. Crie um objeto Lista de Entradas de TOC e obtenha uma interface ITocEntryList nele.
  4. Adicione o objeto Entrada toc que você criou na etapa 1 ao objeto Lista de Entradas do TOC chamando ITocEntryList::AddEntryByIndex.
  5. Crie um objeto TOC e obtenha uma interface IToc nele.
  6. Adicione o objeto Lista de Entradas do TOC que você criou na etapa 3 ao objeto TOC chamando IToc::AddEntryListByIndex.
  7. Crie um objeto TOC Parser e obtenha uma interface ITocParser nele.
  8. Chame ITocParser::Init para inicializar o objeto TOC Parser e associá-lo a um arquivo de vídeo.
  9. Adicione o objeto TOC que você criou na etapa 5 ao objeto TOC Parser chamando ITocParser::AddToc.
  10. Insira o sumário no arquivo de vídeo chamando ITocParser::Commit.

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

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

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

Objetos do Analisador de Sumário

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