Insertar una tabla de contenido en un archivo de vídeo
En este tema se muestra cómo crear una tabla de contenido (TOC) e insertarla en un archivo de vídeo. Para mantener el código de ejemplo corto, la tabla de contenido es muy sencilla; contiene solo una entrada y la entrada se rellena con un mínimo de información.
Para crear una tabla de contenido e insertarla en un archivo, debe crear los cuatro objetos siguientes mediante una llamada a CoCreateInstance.
- Entrada de TOC
- Lista de entradas de TOC
- TABLA DE CONTENIDO
- Analizador de TOC
Los identificadores de clase de los objetos se proporcionan en identificadores de clase para el analizador de tabla de contenido.
En primer lugar, rellene la entrada TOC con información que describa una parte del archivo de vídeo. Agregue la entrada TOC a la lista de entradas de TOC y, a continuación, agregue la lista de entradas de TOC al TOC. Por último, agregue el TOC al analizador de TOC, que proporciona la funcionalidad para insertar el TOC en el archivo de vídeo. En la lista siguiente se proporcionan los pasos con más detalle.
- Cree un objeto TOC Entry y obtenga una interfaz ITocEntry en él.
- Rellene una estructura de TOC_ENTRY_DESCRIPTOR y pásela a ITocEntry::SetDescriptor.
- Cree un objeto TOC Entry List y obtenga una interfaz ITocEntryList en él.
- Agregue el objeto ToC Entry que creó en el paso 1 al objeto TOC Entry List llamando a ITocEntryList::AddEntryByIndex.
- Cree un objeto TOC y obtenga una interfaz IToc en él.
- Agregue el objeto TOC Entry List que creó en el paso 3 al objeto TOC llamando a IToc::AddEntryListByIndex.
- Cree un objeto ToC Parser y obtenga una interfaz ITocParser en él.
- Llame a ITocParser::Init para inicializar el objeto Analizador de TOC y asociarlo a un archivo de vídeo.
- Agregue el objeto TOC que creó en el paso 5 al objeto Analizador de TOC llamando a ITocParser::AddToc.
- Inserte la tabla de contenido en el archivo de vídeo llamando a ITocParser::Commit.
En el código siguiente se muestran los pasos indicados en la 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;
}
Temas relacionados