Incorporation d’une table des matières dans un fichier vidéo
Cette rubrique montre comment créer une table des matières (TOC) et l’incorporer dans un fichier vidéo. Pour que l’exemple de code reste court, la table des matières est très simple ; il ne contient qu’une seule entrée, et l’entrée est remplie avec un minimum d’informations.
Pour créer une table des matières et l’incorporer dans un fichier, vous devez créer les quatre objets suivants en appelant CoCreateInstance.
- Entrée de la matière
- Liste d’entrées de la liste des matières
- Table des matières
- Analyseur toc
Les identificateurs de classe pour les objets sont indiqués dans Identificateurs de classe pour l’analyseur de table des matières.
Tout d’abord, renseignez l’entrée de la matière avec des informations qui décrivent une partie du fichier vidéo. Ajoutez l’entrée TOC à la liste d’entrées de la matière, puis ajoutez la liste d’entrées toc à la liste des matières. Enfin, ajoutez la matière à l’analyseur toC, qui fournit les fonctionnalités d’incorporation de la liste des matières dans le fichier vidéo. La liste suivante présente les étapes plus en détail.
- Créez un objet ToC Entry et obtenez une interface ITocEntry sur celui-ci.
- Remplissez une structure TOC_ENTRY_DESCRIPTOR et passez-la à ITocEntry::SetDescriptor.
- Créez un objet ToC Entry List et obtenez une interface ITocEntryList sur celui-ci.
- Ajoutez l’objet ToC Entry que vous avez créé à l’étape 1 à l’objet ToC Entry List en appelant ITocEntryList::AddEntryByIndex.
- Créez un objet TOC et obtenez une interface IToc sur celui-ci.
- Ajoutez l’objet ToC Entry List que vous avez créé à l’étape 3 à l’objet TABLE des matières en appelant IToc::AddEntryListByIndex.
- Créez un objet ToC Parser et obtenez une interface ITocParser sur celui-ci.
- Appelez ITocParser::Init pour initialiser l’objet ToC Parser et l’associer à un fichier vidéo.
- Ajoutez l’objet TOC que vous avez créé à l’étape 5 à l’objet ToC Parser en appelant ITocParser::AddToc.
- Incorporez la table des matières dans le fichier vidéo en appelant ITocParser::Commit.
Le code suivant illustre les étapes décrites dans la liste précédente.
#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;
}
Rubriques connexes