Использование элементов управления отображением видео

[Компонент, описанный на этой странице, Расширенный отрисовщик видео — это устаревшая функция. Он был заменен простой отрисовщик видео (SVR), предоставляемый через компоненты MediaPlayer и IMFMediaEngine . Чтобы воспроизвести видеоконтент, необходимо отправить данные в один из этих компонентов и разрешить им создать экземпляр нового отрисовщика видео. Эти компоненты оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать новый код MediaPlayer или БОЛЕЕ низкий уровень API IMFMediaEngine для воспроизведения видеотрансляции в Windows вместо EVR, когда это возможно. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]

Интерфейс IMFVideoDisplayControl определяет, как расширенный отрисовщик видео (EVR) отображает видео в окне приложения. Этот интерфейс можно использовать в DirectShow или Media Foundation. Внутри системы элементы управления отображением видео предоставляются выступающим по умолчанию EVR. При написании пользовательского докладчика можно предоставить тот же интерфейс или определить пользовательский интерфейс.

Правильный способ получения указателя на интерфейс МВФVideoDisplayControl зависит от того, используется ли вы версию DirectShow EVR или Media Foundation. Для EVR Media Foundation он также зависит от того, используете ли вы EVR напрямую или используете его через сеанс мультимедиа (что более типично).

Чтобы получить указатель на интерфейс IMFVideoDisplayControl , сделайте следующее:

  1. Получите указатель на интерфейс МВФGetService.

    • Если вы используете фильтр DirectShow EVR, вызовите QueryInterface в фильтре.

    • Если вы используете приемник мультимедиа EVR непосредственно, вызовите QueryInterface в приемнике мультимедиа.

    • Если вы используете сеанс мультимедиа, вызовите QueryInterface в сеансе мультимедиа.

  2. Если вы используете сеанс мультимедиа, дождитесь отправки события MESessionTopologyStatus со значением состояния MF_TOPOSTATUS_READY. (Пропустить этот шаг в противном случае.)

  3. Вызовите МВФGetService::GetService, чтобы получить интерфейс IMFVideoDisplayControl. Идентификатор службы MR_VIDEO_RENDER_SERVICE.

Интерфейс IMFVideoDisplayControl можно использовать для выполнения следующих задач:

  • Задайте окно вырезки.

  • Задайте прямоугольники источника и назначения.

  • Обновите окно видео в ответ на сообщения о окне.

  • Включение или отключение полноэкранного режима.

Окно вырезки

Приложение должно предоставить окно, в котором EVR рисует видео. Чтобы задать окно вырезки, вызовите МВФVideoDisplayControl::SetVideoWindow дескриптором в окно приложения.

Если вы создаете приемник мультимедиа EVR через его объект активации, этот шаг не требуется. Объект активации автоматически вызывает SetVideoWindow с помощью дескриптора окна, предоставленного в функции MFCreateVideoRendererActivate.

Исходные и конечные прямоугольники

Во время воспроизведения выступающий принимает часть составного изображения видео и рисует его на область окна видео. Часть составного изображения — это исходный прямоугольник, а область окна видео — прямоугольник назначения.

Исходный прямоугольник определяется с помощью нормализованных координат, где точка (0.0, 0.0) соответствует верхнему левому углу видео, а (1.0, 1.0) соответствует нижнему правому углу видео. Исходный прямоугольник может быть любым регионом в этом прямоугольнике. Прямоугольник назначения указывается в пикселях относительно клиентской области окна. Исходный прямоугольник по умолчанию — это весь образ, а прямоугольник назначения по умолчанию — пустой прямоугольник.

Чтобы задать прямоугольники источника и назначения, вызовите МВФVideoDisplayControl::SetVideoPosition.

Если вы создаете приемник мультимедиа EVR через его объект активации, этот шаг не требуется. Объект активации автоматически задает прямоугольник назначения, равный всей клиентской области окна. Однако необходимо вызвать SetVideoPosition , если вы хотите изменить исходный прямоугольник или задать другой прямоугольник назначения.

Сообщения окна

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

  • WM_PAINT: вызовИТЕ МВФVideoDisplayControl::RepaintVideo , чтобы перенакрасить видео. Кроме того, избегайте рисования по целевому прямоугольнику во время воспроизведения видео, потому что это может вызвать мерцание.

  • WM_SIZE. Может потребоваться вызвать SetVideoPosition , чтобы изменить размер прямоугольника назначения.

В отличие от фильтра "Средство обработки видео" (VMR) в DirectShow, вам не нужно уведомлять EVR при получении сообщения WM_DISPLAYCHANGE.

Расширенный отрисовщик видео