다음을 통해 공유


자동으로 목차 생성

이 항목에서는 목 차 생성기 (TOC 생성기) 구성 요소를 사용하여 비디오 파일에 대한 목차를 자동으로 생성하는 방법을 보여 줍니다.

TOC 생성기는 DMO(DirectX Media Object)입니다. TOC 생성기 DMO를 사용하려면 비디오 파일을 원본으로 포함하는 DirectX 필터 그래프를 빌드합니다. TOC 생성기 DMO를 필터 그래프에 삽입하고 그래프를 실행합니다. 그런 다음 TOC 생성기 DMO에서 자동으로 생성된 목차를 가져올 수 있습니다.

다음 절차에서는 단계를 자세히 설명합니다.

  1. CoCreateInstance를 호출하여 Filter Graph 개체(CLSID_FilterGraph)를 만들고 IGraphBuilder 인터페이스를 가져옵니다.

  2. CoCreateInstance를 호출하여 DMO 래퍼 필터 개체(CLSID_DMOWrapperFilter)를 만들고 IDMOWrapperFilter 인터페이스를 가져옵니다.

  3. DMO 래퍼 필터의 Init 메서드에 CLSID_CTocGeneratorDmo 전달합니다. 그러면 TOC 생성기 DMO가 만들어지고 DMO 래퍼 필터에 래핑됩니다.

  4. IGraphBuilder 인터페이스의 AddFilter 메서드를 호출하여 래핑된 TOC 생성기 DMO를 필터 그래프에 추가합니다.

    참고

    IGraphBuilder는IFilterGraph에서 상속됩니다.

     

  5. IGraphBuilder 인터페이스의 AddSourceFilter 메서드를 호출하여 souce 필터를 만들고 그래프에 추가합니다.

  6. DMO 래퍼 필터 및 원본 필터에서 핀을 열거합니다. 여기에는 IEnumPins 인터페이스 및 IPin 인터페이스 가져오기가 포함됩니다.

  7. IGraphBuilder 인터페이스의 Connect 메서드를 호출하여 원본 필터 및 래퍼 필터를 연결합니다.

  8. IGraphBuilder 인터페이스의 Render 메서드를 호출하여 그래프를 완료합니다.

  9. 그래프(IMediaControl::Run)를 실행하고 완료할 때까지 기다립니다(IMediaEvent::WaitForCompletion).

  10. DMO 필터 래퍼에서 IPropertyStore 인터페이스를 가져오고 MFPKEY_TOCGENERATOR_TOCREADY 속성의 값을 가져옵니다. 목차가 준비될 때까지 필요한 경우 반복합니다.

  11. IPropertyStore 인터페이스를 사용하여 MFPKEY_TOCGENERATOR_TOCOBJECT 속성의 값을 가져옵니다. 이 속성은 자동으로 생성된 목차를 나타내는 IToc 인터페이스입니다.

다음 코드에서는 목차를 자동으로 생성하는 절차를 보여 줍니다. 이 코드는 이 설명서의 다른 페이지에 표시된 세 가지 도우미 함수(BuildGraph, RunGraphAndWaitGetToc)를 사용합니다.

#include <dshow.h>
#include <dmodshow.h>
#include <wmcodecdsp.h>
#include <dmoreg.h>
#include <propsys.h>
#include <propidl.h>
#include <initguid.h>

HRESULT GetToc(IDMOWrapperFilter* pWrap, IToc** ppToc);
HRESULT RunGraphAndWait(IGraphBuilder* pGraph);
HRESULT BuildGraph(IGraphBuilder* pGraph, IDMOWrapperFilter* pWrap);

WCHAR g_sourceFile[] = L"c:\\experiment\\Seattle.wmv";

void main()
{
   HRESULT hr = E_FAIL;
   hr = CoInitialize(NULL);

   if(SUCCEEDED(hr))
   {
      IGraphBuilder* pBuilder = NULL;
      hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, 
         IID_IGraphBuilder, (VOID**)&pBuilder);

      if(SUCCEEDED(hr))
      {
         IDMOWrapperFilter* pWrap = NULL;
         hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL, CLSCTX_INPROC, 
            IID_IDMOWrapperFilter, (VOID**)&pWrap);

         if(SUCCEEDED(hr))
         {
            hr = pWrap->Init(CLSID_CTocGeneratorDmo, DMOCATEGORY_VIDEO_EFFECT); 

            if(SUCCEEDED(hr))
            {
               hr = BuildGraph(pBuilder, pWrap);

               if(SUCCEEDED(hr))
               {
                  hr = RunGraphAndWait(pBuilder);

                  if(SUCCEEDED(hr))
                  {
                     IToc* pToc = NULL;
                     hr = GetToc(pWrap, &pToc);

                     if(SUCCEEDED(hr))
                     {
                        // Inspect the table of contents by calling IToc methods.

                        pToc->Release();
                        pToc = NULL;
                     }
                  }
               }
            }

            pWrap->Release();
            pWrap = NULL;
         }

         pBuilder->Release();
         pBuilder = NULL;
      }

      CoUninitialize();
   }
}

목차 생성을 위한 BuildGraph 함수

목차 생성을 위한 GetToc 함수

목차 생성을 위한 RunGraphAndWait 함수

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