Lecture d’une table des matières à partir d’un fichier vidéo
Cette rubrique montre comment lire une table des matières qui a déjà été incorporée dans un fichier vidéo.
Commencez par appeler CoCreateInstance pour créer un objet ToC Parser et obtenir une interface ITocParser . Obtenez ensuite les interfaces suivantes en appelant des méthodes.
Utilisez les méthodes de ITocEntry pour inspecter une entrée individuelle dans la table des matières. Par exemple, vous pouvez inspecter le titre, l’heure de début et l’heure de fin de l’entrée.
La liste suivante présente les étapes plus en détail.
- Appelez CoCreateInstance pour créer un objet ToC Parser et obtenir une interface ITocParser sur celui-ci.
- Appelez ITocParser::Init pour initialiser l’analyseur toC et l’associer à un fichier vidéo.
- Obtenez une interface IToc en appelant ITocParser::GetTocByIndex.
- Obtenez une interface ITocEntryList en appelant IToc::GetEntryListByIndex.
- Obtenez une interface ITocEntry en appelant ITocEntryList::GetEntryByIndex.
- Allouez une structure TOC_ENTRY_DESCRIPTOR .
- Remplissez la structure TOC_ENTRY_DESCRIPTOR en appelant ITocEntry::GetDescriptor.
Le code suivant illustre les étapes de la liste précédente.
#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;
}
Rubriques connexes