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


Создание графа фильтров VMR-9

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]

Так как фильтр Отрисовщик видео 9 (VMR-9) не является отрисовщиком видео по умолчанию, приложение, использующее VMR-9, должно явно добавить его в граф и подключить его. В этом разделе представлены два разных подхода к созданию графов фильтров с помощью VMR-9.

Использование построителя графов захвата

Построитель графов захвата — это вспомогательный объект для создания настраиваемых графов фильтров. Его можно использовать для построения графов VMR-9 следующим образом:

  1. Создайте и инициализируйте конструктор графов захвата, как описано в разделе О построителе графов захвата.

  2. Вызовите CoCreateInstance, чтобы создать VMR-9:

    IBaseFilter *pVmr = NULL;
    hr = CoCreateInstance(CLSID_VideoMixingRenderer9, 0, 
        CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pVmr);
    
  3. Вызовите метод IFilterGraph::AddFilter в диспетчере графа фильтров, чтобы добавить VMR-9 в граф фильтра:

    hr = pGraph->AddFilter(pVmr, L"VMR9");
    
  4. Вызовите IGraphBuilder::AddSourceFilter , чтобы добавить фильтр источника для видеофайла:

    IBaseFilter *pSource;
    hr = pGraph->AddSourceFilter(L"C:\\Example.avi", L"Source1", &pSource);
    
  5. Вызовите метод ICaptureGraphBuilder2::RenderStream для отрисовки видеопотока в VMR:

    hr = pBuild->RenderStream(0, 0, pSource, 0, pVmr);  
    
  6. При необходимости снова вызовите RenderStream для отрисовки звукового потока:

    hr = pBuild->RenderStream(0, &MEDIATYPE_Audio, pSource, 0, NULL);
    

Вы можете комбинировать несколько видеопотоков, вызвав AddSourceFilter и RenderStream для каждого исходного файла.

Использование диспетчера graph filter

Если вы предпочитаете не использовать построитель графов захвата, вы можете создать граф VMR-9, просто используя методы в диспетчере фильтров графов, как показано ниже.

  1. Создайте VMR-9 и добавьте его в граф, как показано в предыдущей процедуре.
  2. Используйте AddSourceFilter, чтобы добавить фильтр источника для видеофайла, как показано в предыдущей процедуре.
  3. Если требуется отрисовка звука, создайте экземпляр фильтра отрисовщика DirectSound и добавьте его в граф фильтра.
  4. Используйте метод IBaseFilter::EnumPins, чтобы найти выходную закрепления в исходном фильтре. Дополнительные сведения см. в разделе Перечисление закрепления .
  5. Запросите к диспетчеру графов фильтров интерфейс IFilterGraph2.
  6. Вызовите IFilterGraph2::RenderEx с флагом AM_RENDEREX_RENDERTOEXISTINGRENDERERS. Этот вызов отрисовывает выходной контакт, используя только фильтры отрисовщика, уже существующие в графе, в данном случае VMR-9 и DirectSound Renderer. Это не позволяет логике Intelligent Connect добавить в граф отрисовщик видео по умолчанию, что приведет к тому, что VMR-9 не подключен.

Создание графов с помощью конструктора графов захвата