다음을 통해 공유


비디오 파일에 목차 포함

이 항목에서는 목차(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 항목 목록 개체를 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;
}

비디오 파일에서 목차 읽기

목차 파서 개체

목차 파서 프로그래밍 가이드