Создание графа фильтров 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 следующим образом:
Создайте и инициализируйте построитель графа захвата, как описано в разделе о построителе графа захвата.
Вызовите CoCreateInstance, чтобы создать VMR-9:
IBaseFilter *pVmr = NULL; hr = CoCreateInstance(CLSID_VideoMixingRenderer9, 0, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pVmr);
Вызовите IFilterGraph::AddFilter в менеджере графов фильтров, чтобы добавить VMR-9 в граф.
hr = pGraph->AddFilter(pVmr, L"VMR9");
Вызовите IGraphBuilder::AddSourceFilter, чтобы добавить исходный фильтр для видеофайла:
IBaseFilter *pSource; hr = pGraph->AddSourceFilter(L"C:\\Example.avi", L"Source1", &pSource);
Вызовите метод ICaptureGraphBuilder2::RenderStream для отрисовки видеопотока в VMR:
hr = pBuild->RenderStream(0, 0, pSource, 0, pVmr);
При необходимости вызовите RenderStream еще раз, чтобы отобразить аудиопоток:
hr = pBuild->RenderStream(0, &MEDIATYPE_Audio, pSource, 0, NULL);
Вы можете смешивать несколько видеопотоков, вызвав AddSourceFilter и RenderStream для каждого исходного файла.
Использование диспетчера графов фильтров
Если вы предпочитаете не использовать построитель графов записи, вы можете создать граф VMR-9, просто используя методы в диспетчере графов фильтров, как показано ниже.
- Создайте VMR-9 и добавьте его в граф, как показано в предыдущей процедуре.
- Используйте AddSourceFilter, чтобы добавить исходный фильтр для видеофайла, как показано в предыдущей процедуре.
- Если вы хотите отобразить звук, создайте экземпляр фильтра DirectSound Renderer и добавьте его в граф фильтров.
- Используйте метод IBaseFilter::EnumPins, чтобы найти выходной пин-код в исходном фильтре. Дополнительные сведения см. в перечислении пин-кодов.
- Запросите у диспетчера графов фильтров интерфейс IFilterGraph2.
- Вызовите IFilterGraph2::RenderEx с флагом AM_RENDEREX_RENDERTOEXISTINGRENDERERS. Этот вызов отрисовывает выходной пин, используя только фильтры визуализатора, уже входящие в граф — в этом случае VMR-9 и DirectSound Renderer. Это мешает логике Intelligent Connect добавить обработчик видео по умолчанию в граф, который оставит VMR-9 неподключенным.
Связанные разделы