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.
- Crie um objeto De entrada TOC e obtenha uma interface ITocEntry nele.
- Preencha uma estrutura TOC_ENTRY_DESCRIPTOR e passe-a para ITocEntry::SetDescriptor.
- Crie um objeto Lista de Entradas de TOC e obtenha uma interface ITocEntryList nele.
- Adicione o objeto Entrada toc que você criou na etapa 1 ao objeto Lista de Entradas do TOC chamando ITocEntryList::AddEntryByIndex.
- Crie um objeto TOC e obtenha uma interface IToc nele.
- Adicione o objeto Lista de Entradas do TOC que você criou na etapa 3 ao objeto TOC chamando IToc::AddEntryListByIndex.
- Crie um objeto TOC Parser e obtenha uma interface ITocParser nele.
- Chame ITocParser::Init para inicializar o objeto TOC Parser e associá-lo a um arquivo de vídeo.
- Adicione o objeto TOC que você criou na etapa 5 ao objeto TOC Parser chamando ITocParser::AddToc.
- 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;
}
Tópicos relacionados