Generar automáticamente una tabla de contenido
En este tema se muestra cómo usar el componente Generador de tabla de contenido (generador de TOC) para generar automáticamente una tabla de contenido para un archivo de vídeo.
El generador de TOC es un objeto multimedia de DirectX (DMO). Para usar el generador de TOC DMO, cree un grafo de filtro DirectX que tenga un archivo de vídeo como origen. Inserte el DMO del generador de TOC en el gráfico de filtros y ejecute el gráfico. A continuación, puede obtener la tabla de contenido generada automáticamente desde el generador de TOC DMO.
En el procedimiento siguiente se proporcionan los pasos con más detalle.
Llame a CoCreateInstance para crear un objeto Filter Graph (CLSID_FilterGraph) y obtener una interfaz IGraphBuilder .
Llame a CoCreateInstance para crear un objeto Filter de contenedor de DMO (CLSID_DMOWrapperFilter) y obtener una interfaz IDMOWrapperFilter .
Pase CLSID_CTocGeneratorDmo al método Init del filtro contenedor DMO. Esto crea un DMO del generador de TOC y lo ajusta en el filtro contenedor DMO.
Llame al método AddFilter de la interfaz IGraphBuilder para agregar el generador de TOC ajustado DMO al gráfico de filtros.
Nota:
IGraphBuilder hereda de IFilterGraph.
Llame al método AddSourceFilter de la interfaz IGraphBuilder para crear un filtro souce y agregarlo al grafo.
Enumerar patillas en el filtro contenedor DMO y el filtro de origen. Esto implica obtener interfaces IEnumPins e interfaces IPin .
Conecte el filtro de origen y el filtro contenedor llamando al método Connect de la interfaz IGraphBuilder .
Complete el gráfico llamando al método Render de la interfaz IGraphBuilder .
Ejecute el grafo (IMediaControl::Run) y espere a que se complete (IMediaEvent::WaitForCompletion).
Obtenga una interfaz IPropertyStore en el contenedor de filtros DMO y obtenga el valor de la propiedad MFPKEY_TOCGENERATOR_TOCREADY . Repita si es necesario hasta que la tabla de contenido esté lista.
Use la interfaz IPropertyStore para obtener el valor de la propiedad MFPKEY_TOCGENERATOR_TOCOBJECT . Esta propiedad es una interfaz IToc que representa la tabla de contenido generada automáticamente.
En el código siguiente se muestra el procedimiento para generar automáticamente una tabla de contenido. El código usa tres funciones auxiliares (BuildGraph, RunGraphAndWait y GetToc) que se muestran en otras páginas de esta documentación.
#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();
}
}
Temas relacionados