Leer una tabla de contenido de un archivo de vídeo
En este tema se muestra cómo leer una tabla de contenido que ya se ha incrustado en un archivo de vídeo.
Para empezar, llame a CoCreateInstance para crear un objeto Parser de TOC y obtener una interfaz ITocParser . A continuación, obtenga las siguientes interfaces mediante una llamada a métodos.
Use los métodos de ITocEntry para inspeccionar una entrada individual en la tabla de contenido. Por ejemplo, puede inspeccionar el título, la hora de inicio y la hora de finalización de la entrada.
En la lista siguiente se proporcionan los pasos con más detalle.
- Llame a CoCreateInstance para crear un objeto de analizador de TOC y obtener una interfaz ITocParser en ella.
- Llame a ITocParser::Init para inicializar el analizador de TOC y asociarlo a un archivo de vídeo.
- Obtenga una interfaz IToc llamando a ITocParser::GetTocByIndex.
- Obtenga una interfaz ITocEntryList llamando a IToc::GetEntryListByIndex.
- Obtenga una interfaz ITocEntry llamando a ITocEntryList::GetEntryByIndex.
- Asigne una estructura de TOC_ENTRY_DESCRIPTOR .
- Rellene la estructura de TOC_ENTRY_DESCRIPTOR llamando a ITocEntry::GetDescriptor.
En el código siguiente se muestran los pasos de la lista anterior.
#include <stdio.h>
#include <wmcodecdsp.h>
HRESULT ShowEntryInfo(ITocEntry* pEntry);
void main()
{
HRESULT hr = CoInitialize(NULL);
if(SUCCEEDED(hr))
{
ITocParser* pTocParser = NULL;
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))
{
IToc* pToc = NULL;
hr = pTocParser->GetTocByIndex(TOC_POS_TOPLEVELOBJECT, 0, &pToc);
if(SUCCEEDED(hr))
{
ITocEntryList* pEntryList = NULL;
hr = pToc->GetEntryListByIndex(0, &pEntryList);
if(SUCCEEDED(hr))
{
ITocEntry* pEntry = NULL;
hr = pEntryList->GetEntryByIndex(0, &pEntry);
if(SUCCEEDED(hr))
{
hr = ShowEntryInfo(pEntry);
pEntry->Release();
pEntry = NULL;
}
pEntryList->Release();
pEntryList = NULL;
}
pToc->Release();
pToc = NULL;
}
}
pTocParser->Release();
pTocParser = NULL;
}
CoUninitialize();
}
}
HRESULT ShowEntryInfo(ITocEntry* pEntry)
{
HRESULT hr = E_FAIL;
TOC_ENTRY_DESCRIPTOR entryDesc = {0};
hr = pEntry->GetDescriptor(&entryDesc);
if(SUCCEEDED(hr))
{
printf_s("qwStartTime: %x\n", entryDesc.qwStartTime);
printf_s("qwEndTime: %x\n", entryDesc.qwEndTime);
printf_s("qwStartStartPacketOffset: %x\n", entryDesc.qwStartPacketOffset);
printf_s("qwEndPacketOffset: %x\n", entryDesc.qwEndPacketOffset);
printf_s("qwRepresentativeFrameTime: %x\n", entryDesc.qwRepresentativeFrameTime);
}
return hr;
}
Temas relacionados