Einbetten eines Inhaltsverzeichnisses in eine Videodatei
In diesem Thema wird veranschaulicht, wie Sie ein Inhaltsverzeichnis (ToC) erstellen und in eine Videodatei einbetten. Um den Beispielcode kurz zu halten, ist das Inhaltsverzeichnis sehr einfach; Es enthält nur einen Eintrag, und der Eintrag wird mit einem Minimum an Informationen aufgefüllt.
Um ein Inhaltsverzeichnis zu erstellen und es in eine Datei einzubetten, müssen Sie die folgenden vier Objekte erstellen, indem Sie CoCreateInstance aufrufen.
- ToC-Eintrag
- ToC-Eintragsliste
- INHALTSVERZEICHNIS
- ToC-Parser
Klassenbezeichner für die -Objekte werden in Klassenbezeichnern für den Inhaltsverzeichnisparser angegeben.
Füllen Sie zunächst den ToC-Eintrag mit Informationen, die einen Teil der Videodatei beschreiben. Fügen Sie den ToC-Eintrag zur ToC-Eintragsliste hinzu, und fügen Sie dann die ToC-Eintragsliste dem ToC hinzu. Fügen Sie schließlich den ToC zum ToC-Parser hinzu, der die Funktionalität zum Einbetten des ToC in die Videodatei bereitstellt. Die folgende Liste enthält ausführlichere Schritte.
- Erstellen Sie ein TOC Entry-Objekt, und rufen Sie eine ITocEntry-Schnittstelle darauf ab.
- Füllen Sie eine TOC_ENTRY_DESCRIPTOR-Struktur auf, und übergeben Sie sie an ITocEntry::SetDescriptor.
- Erstellen Sie ein TOC-Eintragslistenobjekt, und rufen Sie eine ITocEntryList-Schnittstelle darauf ab.
- Fügen Sie das TOC Entry-Objekt, das Sie in Schritt 1 erstellt haben, dem ToC-Eintragslistenobjekt hinzu, indem Sie ITocEntryList::AddEntryByIndex aufrufen.
- Erstellen Sie ein ToC-Objekt, und rufen Sie eine IToc-Schnittstelle darauf ab.
- Fügen Sie das in Schritt 3 erstellte TOC-Eintragslistenobjekt dem TOC-Objekt hinzu, indem Sie IToc::AddEntryListByIndex aufrufen.
- Erstellen Sie ein TOC Parser-Objekt, und rufen Sie eine ITocParser-Schnittstelle darauf ab.
- Rufen Sie ITocParser::Init auf, um das TOC Parser-Objekt zu initialisieren und es einer Videodatei zuzuordnen.
- Fügen Sie das in Schritt 5 erstellte TOC-Objekt zum TOC-Parser-Objekt hinzu, indem Sie ITocParser::AddToc aufrufen.
- Betten Sie das Inhaltsverzeichnis in die Videodatei ein, indem Sie ITocParser::Commit aufrufen.
Der folgende Code veranschaulicht die Schritte in der vorherigen Liste.
#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;
}
Zugehörige Themen