Создание графа фильтров 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 для каждого исходного файла.
Использование диспетчера graph filter
Если вы предпочитаете не использовать построитель графов захвата, вы можете создать граф VMR-9, просто используя методы в диспетчере фильтров графов, как показано ниже.
- Создайте VMR-9 и добавьте его в граф, как показано в предыдущей процедуре.
- Используйте AddSourceFilter, чтобы добавить фильтр источника для видеофайла, как показано в предыдущей процедуре.
- Если требуется отрисовка звука, создайте экземпляр фильтра отрисовщика DirectSound и добавьте его в граф фильтра.
- Используйте метод IBaseFilter::EnumPins, чтобы найти выходную закрепления в исходном фильтре. Дополнительные сведения см. в разделе Перечисление закрепления .
- Запросите к диспетчеру графов фильтров интерфейс IFilterGraph2.
- Вызовите IFilterGraph2::RenderEx с флагом AM_RENDEREX_RENDERTOEXISTINGRENDERERS. Этот вызов отрисовывает выходной контакт, используя только фильтры отрисовщика, уже существующие в графе, в данном случае VMR-9 и DirectSound Renderer. Это не позволяет логике Intelligent Connect добавить в граф отрисовщик видео по умолчанию, что приведет к тому, что VMR-9 не подключен.
Связанные темы