從影片檔案讀取目錄
本主題示範如何讀取已經內嵌在影片檔案中的目錄。
首先呼叫 CoCreateInstance 來建立 TOC Parser 物件,並取得 ITocParser 介面。 然後呼叫 方法來取得下列介面。
使用 ITocEntry 的 方法來檢查目錄中的個別專案。 例如,您可以檢查標題、開始時間和專案的結束時間。
下列清單提供更詳細的步驟。
- 呼叫 CoCreateInstance 以建立 TOC 剖析器物件,並在其上取得 ITocParser 介面。
- 呼叫 ITocParser::Init 來初始化 TOC 剖析器,並將它與影片檔案產生關聯。
- 呼叫ITocParser::GetTocByIndex 以取得 IToc介面。
- 呼叫IToc::GetEntryListByIndex以取得ITocEntryList介面。
- 呼叫ITocEntryList::GetEntryByIndex以取得ITocEntry介面。
- 配置 TOC_ENTRY_DESCRIPTOR 結構。
- 呼叫ITocEntry::GetDescriptor來填入TOC_ENTRY_DESCRIPTOR結構。
下列程式碼示範上述清單中的步驟。
#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;
}
相關主題