从视频文件读取目录
本主题演示如何读取已嵌入到视频文件中的目录。
首先调用 CoCreateInstance 来创建 TOC 分析器对象并获取 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;
}
相关主题