次の方法で共有


ビデオ ファイルに目次を埋め込む

このトピックでは、目次 (TOC) を作成し、ビデオ ファイルに埋め込む方法について説明します。 コード例を短く保つために、目次は非常に単純です。エントリは 1 つだけ含まれており、エントリには最小限の情報が設定されます。

目次を作成してファイルに埋め込むには、 CoCreateInstance を呼び出して次の 4 つのオブジェクトを作成する必要があります。

  • TOC エントリ
  • TOC エントリ リスト
  • 目次
  • TOC パーサー

オブジェクトのクラス識別子は、 目次パーサーのクラス識別子で指定されます。

まず、ビデオ ファイルの 1 つの部分を説明する情報を 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 エントリ リスト オブジェクトに追加します。
  5. TOC オブジェクトを作成し、その上に IToc インターフェイスを取得します。
  6. IToc::AddEntryListByIndex を呼び出して、手順 3 で作成した TOC エントリ リスト オブジェクトを TOC オブジェクトに追加します。
  7. TOC パーサー オブジェクトを作成し、その上に ITocParser インターフェイスを 取得します。
  8. ITocParser::Init を呼び出して TOC パーサー オブジェクトを初期化し、ビデオ ファイルに関連付けます。
  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;
}

ビデオ ファイルからの目次の読み取り

目次パーサー オブジェクト

目次パーサー プログラミング ガイド