Lesen eines Inhaltsverzeichnis aus einer Videodatei
In diesem Thema wird veranschaulicht, wie Sie ein Inhaltsverzeichnis lesen, das bereits in eine Videodatei eingebettet wurde.
Rufen Sie zunächst CoCreateInstance auf, um ein TOC-Parserobjekt zu erstellen und eine ITocParser-Schnittstelle zu erhalten. Rufen Sie dann die folgenden Schnittstellen ab, indem Sie Methoden aufrufen.
Verwenden Sie die Methoden von ITocEntry, um einen einzelnen Eintrag im Inhaltsverzeichnis zu überprüfen. Beispielsweise können Sie den Titel, die Startzeit und die Endzeit des Eintrags überprüfen.
In der folgenden Liste sind die Schritte ausführlicher aufgeführt.
- Rufen Sie CoCreateInstance auf, um ein TOC-Parserobjekt zu erstellen und eine ITocParser-Schnittstelle zu erhalten.
- Rufen Sie ITocParser::Init auf, um den TOC-Parser zu initialisieren und einer Videodatei zu zuordnen.
- Rufen Sie eine IToc-Schnittstelle ab, indem Sie ITocParser::GetTocByIndex aufrufen.
- Rufen Sie eine ITocEntryList-Schnittstelle ab, indem Sie IToc::GetEntryListByIndex aufrufen.
- Rufen Sie eine ITocEntry-Schnittstelle ab, indem Sie ITocEntryList::GetEntryByIndex aufrufen.
- Ordnen Sie eine TOC _ ENTRY _ DESCRIPTOR-Struktur zu.
- Füllen Sie die TOC _ ENTRY _ DESCRIPTOR-Struktur auf, indem Sie ITocEntry::GetDescriptor aufrufen.
Der folgende Code veranschaulicht die Schritte in der vorherigen Liste.
#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;
}