Поделиться через


Автоматическое создание оглавления

В этом разделе показано, как использовать компонент генератора оглавление (генератор оглавление) для автоматического создания оглавление для видеофайла.

Генератор оглавлия является объектом мультимедиа DirectX (DMO). Чтобы использовать DMO генератора ОГЛА, создайте граф фильтра DirectX с видеофайлом в качестве источника. Вставьте DMO генератора оглавлений в граф фильтра и запустите граф. Затем можно получить автоматически созданное оглавление из DMO генератора оглавлений.

В следующей процедуре описаны более подробные действия.

  1. Вызовите CoCreateInstance , чтобы создать объект Filter Graph (CLSID_FilterGraph) и получить интерфейс IGraphBuilder .

  2. Вызовите CoCreateInstance , чтобы создать объект фильтра-оболочки DMO (CLSID_DMOWrapperFilter) и получить интерфейс IDMOWrapperFilter .

  3. Передайте CLSID_CTocGeneratorDmo в метод Init фильтра-оболочки DMO. При этом создается DMO генератора оглавлений и упаковывается в фильтр-оболочку DMO.

  4. Вызовите метод AddFilter интерфейса IGraphBuilder , чтобы добавить оболочку DMO генератора ОГЛА в граф фильтра.

    Примечание

    IGraphBuilder наследуется от IFilterGraph.

     

  5. Вызовите метод AddSourceFilter интерфейса IGraphBuilder , чтобы создать фильтр souce и добавить его в граф.

  6. Перечисление закреплений в фильтре-оболочке DMO и фильтре источника. Это включает в себя получение интерфейсов IEnumPins и интерфейсов IPin .

  7. Подключите исходный фильтр и фильтр-оболочку, вызвав метод Connect интерфейса IGraphBuilder .

  8. Завершите граф, вызвав метод Render интерфейса IGraphBuilder .

  9. Запустите граф (IMediaControl::Run) и дождитесь его завершения (IMediaEvent::WaitForCompletion).

  10. Получите интерфейс IPropertyStore в оболочке фильтра DMO и получите значение свойства MFPKEY_TOCGENERATOR_TOCREADY . При необходимости повторяйте, пока не будет готово оглавление.

  11. Используйте интерфейс IPropertyStore , чтобы получить значение свойства MFPKEY_TOCGENERATOR_TOCOBJECT . Это свойство является интерфейсом IToc , который представляет автоматически созданное оглавление.

В следующем коде показана процедура автоматического создания оглавления. В коде используются три вспомогательные функции (BuildGraph, RunGraphAndWait и GetToc), которые показаны на других страницах этой документации.

#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 для создания оглавления

Руководство по программированию средства синтаксического анализа оглавлений