Gerando um sumário automaticamente
Este tópico demonstra como usar o componente Gerador de Sumário (Gerador de TOC) para gerar automaticamente um sumário para um arquivo de vídeo.
O Gerador TOC é um DMO (Objeto de Mídia DirectX). Para usar o DMO do Gerador TOC, crie um grafo de filtro DirectX que tenha um arquivo de vídeo como sua origem. Insira o DMO do Gerador TOC no grafo de filtro e execute o grafo. Em seguida, você pode obter o sumário gerado automaticamente do DMO do Gerador toc.
O procedimento a seguir fornece as etapas com mais detalhes.
Chame CoCreateInstance para criar um objeto Filter Graph (CLSID_FilterGraph) e obter uma interface IGraphBuilder .
Chame CoCreateInstance para criar um objeto DMO Wrapper Filter (CLSID_DMOWrapperFilter) e obter uma interface IDMOWrapperFilter .
Passe CLSID_CTocGeneratorDmo para o método Init do filtro wrapper de DMO. Isso cria um DMO do Gerador de TOC e o encapsula no filtro de wrapper de DMO.
Chame o método AddFilter da interface IGraphBuilder para adicionar o DMO do gerador TOC encapsulado ao grafo de filtro.
Observação
IGraphBuilder herda do IFilterGraph.
Chame o método AddSourceFilter da interface IGraphBuilder para criar um filtro souce e adicioná-lo ao grafo.
Enumerar pinos no filtro de wrapper DMO e no filtro de origem. Isso envolve a obtenção de interfaces IEnumPins e interfaces IPin .
Conecte o filtro de origem e o filtro wrapper chamando o método Connect da interface IGraphBuilder .
Conclua o grafo chamando o método Render da interface IGraphBuilder .
Execute o grafo (IMediaControl::Run) e aguarde até que ele seja concluído (IMediaEvent::WaitForCompletion).
Obtenha uma interface IPropertyStore em seu wrapper de filtro DMO e obtenha o valor da propriedade MFPKEY_TOCGENERATOR_TOCREADY . Repita se necessário até que o sumário esteja pronto.
Use sua interface IPropertyStore para obter o valor da propriedade MFPKEY_TOCGENERATOR_TOCOBJECT . Essa propriedade é uma interface IToc que representa o sumário gerado automaticamente.
O código a seguir demonstra o procedimento para gerar um sumário automaticamente. O código usa três funções auxiliares (BuildGraph, RunGraphAndWait e GetToc) que são mostradas em outras páginas desta documentação.
#include <dshow.h>
#include <dmodshow.h>
#include <wmcodecdsp.h>
#include <dmoreg.h>
#include <propsys.h>
#include <propidl.h>
#include <initguid.h>
HRESULT GetToc(IDMOWrapperFilter* pWrap, IToc** ppToc);
HRESULT RunGraphAndWait(IGraphBuilder* pGraph);
HRESULT BuildGraph(IGraphBuilder* pGraph, IDMOWrapperFilter* pWrap);
WCHAR g_sourceFile[] = L"c:\\experiment\\Seattle.wmv";
void main()
{
HRESULT hr = E_FAIL;
hr = CoInitialize(NULL);
if(SUCCEEDED(hr))
{
IGraphBuilder* pBuilder = NULL;
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (VOID**)&pBuilder);
if(SUCCEEDED(hr))
{
IDMOWrapperFilter* pWrap = NULL;
hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL, CLSCTX_INPROC,
IID_IDMOWrapperFilter, (VOID**)&pWrap);
if(SUCCEEDED(hr))
{
hr = pWrap->Init(CLSID_CTocGeneratorDmo, DMOCATEGORY_VIDEO_EFFECT);
if(SUCCEEDED(hr))
{
hr = BuildGraph(pBuilder, pWrap);
if(SUCCEEDED(hr))
{
hr = RunGraphAndWait(pBuilder);
if(SUCCEEDED(hr))
{
IToc* pToc = NULL;
hr = GetToc(pWrap, &pToc);
if(SUCCEEDED(hr))
{
// Inspect the table of contents by calling IToc methods.
pToc->Release();
pToc = NULL;
}
}
}
}
pWrap->Release();
pWrap = NULL;
}
pBuilder->Release();
pBuilder = NULL;
}
CoUninitialize();
}
}
Tópicos relacionados