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


Создание графа фильтров 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 для каждого исходного файла.

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

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

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

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