Lesen eines Inhaltsverzeichnisses 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 Parser-Objekt zu erstellen und eine ITocParser-Schnittstelle abzurufen. 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. Sie können beispielsweise den Titel, die Startzeit und die Endzeit des Eintrags überprüfen.
Die folgende Liste enthält ausführlichere Schritte.
- Rufen Sie CoCreateInstance auf, um ein TOC-Parser-Objekt zu erstellen und eine ITocParser-Schnittstelle dafür abzurufen.
- Rufen Sie ITocParser::Init auf, um den ToC-Parser zu initialisieren und einer Videodatei zuzuordnen.
- 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;
}
Zugehörige Themen