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


Фильтр отрисовщика видео

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

Фильтр отрисовщика видео — это надежный универсальный отрисовщик видео.

Примечание

В Windows XP и более поздних версиях отрисовщик видео по умолчанию — фильтр 7 (VMR-7). VmR-7 и Video Renderer имеют понятное имя "Видеорисовщик". На более ранних платформах отрисовщик видео является отрисовщиком по умолчанию. См. раздел Выбор правильного отрисовщика.

 

Отрисовщик видео использует поверхности DirectDraw и наложения, если видео карта их поддерживает. Диспетчер фильтров графов предоставляет интерфейс IVideoWindow , который позволяет приложениям задавать и извлекать свойства в отрисовщике видео. При использовании новых видеоадаптеров видео отрисовщик поддерживает отрисовку в полноэкранном режиме. В противном случае диспетчер фильтров графов автоматически переключается на фильтр полноэкранного отрисовщика в полноэкранном режиме. Дополнительные сведения см. в разделе IVideoWindow::p ut_FullScreenMode .

  • Важно!

    Как правило, окно видео этого фильтра обрабатывает сообщения в рабочем потоке, созданном диспетчером фильтров графов. Если приложение напрямую создает фильтр с помощью CoCreateInstance, окно видео обрабатывает сообщения в потоке приложения. В этом случае поток приложения должен иметь цикл сообщений для отправки сообщений в окно видео. Кроме того, поток не должен завершать работу до окончательного вызова Release в отрисовщик видео, который происходит при завершении работы диспетчера фильтров Graph. В противном случае приложение может оказаться взаимоблокировкой.

     

Метка Значение
Интерфейсы фильтрации IBaseFilter, IBasicVideo, IBasicVideo2, IDirectDrawVideo, IKsPropertySet, IMediaPosition, IMediaSeeking, IQualityControl, IQualProp, IVideoWindow
Типы носителей входных контактов Несжатые форматы видео.
Интерфейсы ввода-закрепления IMemInputPin, IOverlay, IPin, IPinConnection, IQualityControl
Типы носителей выводных контактов Не применяется
Интерфейсы вывода контактов Не применяется
Фильтр CLSID CLSID_VideoRenderer
CLSID страницы свойств Страница свойств отсутствует.
Исполняемый файл quartz.dll
Заслуга Windows XP и более поздние версии: MERIT_UNLIKELY
Категория фильтра CLSID_LegacyAmFilterCategory

 

Комментарии

В отладочной версии Quartz.dll, если уровень отладки LOG_TRACE имеет значение 5 или выше, отрисовщик видео отображает метки времени каждого кадра в окне видео. Эти числа не отображаются в розничной версии библиотеки DLL. Дополнительные сведения см. в разделе Отладка выходных функций.

Следующие замечания предназначены для разработчиков фильтров:

Отрисовщик видео принимает форматы YUV, если карта поддерживает поверхности наложения YUV. Однако при первом подключении к фильтру вышестоящий видео отрисовщику требуется формат RGB, соответствующий глубине цвета текущих параметров монитора. Например, если текущий параметр отображения имеет 24-разрядный цвет, фильтр вышестоящий должен иметь возможность предоставлять 24-разрядное видео RGB. Когда граф фильтра переключается в состояние выполнения, отрисовщик видео согласовывает динамическое изменение формата в соответствии с цветовой областью YUV.

При подключении с типом RGB отрисовщик видео гарантирует, что он может использовать GDI в случае, если DirectDraw недоступен. Он переключится на GDI, если другое приложение использует видеопамяти, если прямоугольник видео расположен на двух мониторах в системе с несколькими мониторами или если прямоугольник видео полностью скрыт другим окном.

Примечание

Отрисовщик смешивания видео не выполняет этот тип динамического изменения формата и не требует типа мультимедиа RGB, так как он никогда не использует GDI для отрисовки.

 

Чтобы согласовать изменение формата, отрисовщик видео вызывает IPin::QueryAccept с новым типом мультимедиа. Если фильтр вышестоящий возвращает S_OK, отрисовщик видео присоединяет новый носитель к следующему образцу. Фильтр вышестоящий должен вызывать IMediaSample::GetMediaType для каждого примера. Если GetMediaType возвращает значение, отличное от NULL, это указывает на изменение формата, и фильтр вышестоящий должен реагировать на переключение типов выходных данных. (Не переключайте типы в методе QueryAccept.) Фильтр вышестоящий должен принимать по крайней мере основные типы RGB и в идеале должен поддерживать общие типы YUV. Во время потоковой передачи отрисовщик видео может переключаться между типами YUV и RGB любое количество раз. Отрисовщик видео не принимает изменения динамического формата, инициированные фильтром вышестоящий.

Когда отрисовщик видео обращается к поверхности наложения DirectDraw, он выделяет один буфер для входного контакта. Если фильтр вышестоящий попытается принудительно установить соединение с помощью нескольких буферов, отрисовщик видео не сможет использовать поверхность наложения.

Фильтры DirectShow