共用方式為


在影片檔案中內嵌目錄

本主題示範如何建立目錄 (TOC) ,並將其內嵌在影片檔案中。 為了讓範例程式碼保持簡短,目錄非常簡單;它只包含一個專案,而且專案會填入最少的資訊。

若要建立目錄並將它內嵌在檔案中,您必須呼叫 CoCreateInstance來建立下列四個物件。

  • TOC 專案
  • TOC 專案清單
  • 目錄
  • TOC 剖析器

物件的類別識別碼是在 目錄剖析器的類別識別碼中提供。

首先,將描述影片檔案一部分的資訊填入 TOC 專案。 將 TOC 專案新增至 TOC 專案清單,然後將 TOC 專案清單新增至 TOC。 最後,將 TOC 新增至 TOC 剖析器,以提供在影片檔案中內嵌 TOC 的功能。 下列清單提供更詳細的步驟。

  1. 建立 TOC Entry 物件,並在其上取得 ITocEntry 介面。
  2. 填入 TOC_ENTRY_DESCRIPTOR結構, 並將其傳遞至 ITocEntry::SetDescriptor
  3. 建立 TOC Entry List 物件,並在其上取得 ITocEntryList 介面。
  4. 呼叫 ITocEntryList::AddEntryByIndex,將您在步驟 1 中建立的 TOC Entry 物件新增至 TOC Entry List 物件。
  5. 建立 TOC 物件,並在其上取得 IToc 介面。
  6. 呼叫 IToc::AddEntryListByIndex,將您在步驟 3 中建立的 TOC Entry List 物件新增至 TOC 物件。
  7. 建立 TOC 剖析器物件,並在其上取得 ITocParser 介面。
  8. 呼叫 ITocParser::Init 來初始化 TOC Parser 物件,並將其與視訊檔案產生關聯。
  9. 呼叫 ITocParser::AddToc,將您在步驟 5 中建立的 TOC 物件新增至 TOC 剖析器物件。
  10. 呼叫 ITocParser::Commit,在影片檔案中內嵌目錄。

下列程式碼示範上述清單中提供的步驟。

#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;
}

從影片檔案讀取目錄

目錄剖析器物件

目錄剖析器程式設計手冊