Использование элементов управления "Миксер видео"

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

Средство смешивания EVR предоставляет несколько интерфейсов, которые приложение может использовать для управления процессом обработки видео миксера. Эти интерфейсы можно использовать в DirectShow или Media Foundation.

Интерфейс Description
Интерфейс IMFVideoMixerBitmap Альфа-смешивает статический растровый рисунок на видео.
Интерфейс IMFVideoMixerControl Управляет тем, как EVR смешивает подпотоки видео.
Интерфейс IMFVideoProcessor Управляет настройкой цвета, фильтрами изображений и другими возможностями обработки видео. Этот интерфейс предоставляет доступ к функциям, реализованным графическим драйвером, поэтому точные возможности будут зависеть от графического драйвера пользователя.

 

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

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

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

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

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

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

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

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

Альфа-смешивание растрового изображения на видео

Интерфейс IMFVideoMixerBitmap можно использовать для альфа-смешивания статического растрового изображения на видео во время воспроизведения. Растровое изображение можно хранить в области Direct3D, указанной в виде указателя IDirect3DSurface9 , или использовать растровое изображение GDI.

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

Чтобы задать растровое изображение, вызовите МВФVideoMixerBitmap::SetAlphaBitmap. Этот метод принимает указатель на структуру MFVideoAlphaBitmap , указывающую растровое изображение и параметры альфа-смешивания. Пример кода см. в справочном разделе метода SetAlphaBitmap .

После задания растрового изображения можно обновить параметры смешивания, включая исходные и целевые прямоугольники, вызвав МВФVideoMixerBitmap::UpdateAlphaBitmapParameters. Обновление вступает в силу в следующем видеокадре. Видео должно воспроизводиться для обновления. Этот метод можно использовать для выполнения простых анимаций на растровом рисунке. (Если вам нужны более сложные эффекты, рассмотрите возможность написания пользовательского миксера EVR.)

Чтобы очистить растровое изображение, вызовите МВФVideoMixerBitmap::ClearAlphaBitmap.

Управление подпотоками

EVR может смешивать один или несколько подпотоков видео на основной видеопоток. Для управления перемешиванием подпотоков используйте интерфейс IMFVideoMixerControl .

  • ВызовИТЕ МВФVideoMixerControl::SetStreamOutputRect , чтобы задать положение подпотока в составном видеокадре.

  • ВызовИТЕ МВФVideoMixerControl::SetStreamZOrder , чтобы задать порядок z для подпотоков. EVR рисует видеопотоки в порядке их значений z-порядка, начиная с нуля. Основной видеопоток всегда находится в порядке z.

Параметры обработчика видео

Средство микширования EVR использует ускорение видео DirectX (DXVA) для обработки видео в входных потоках. Точные возможности обработки зависят от графического драйвера. Возможности обработки видео описаны с помощью структуры DXVA2_VideoProcessorCaps. Определенный набор возможностей называется режимом обработки видео, каждый режим определяется GUID. Список предопределенных графических идентификаторов см. в разделе IDirectXVideoProcessorService::GetVideoProcessorDeviceGuids. Драйвер может определить дополнительные идентификаторы GUID для конкретного поставщика, представляющие различные сочетания возможностей.

Чтобы найти поддерживаемые режимы и возможности каждого режима, сделайте следующее:

  1. Вызовите МВФGetService::GetService, чтобы получить указатель на интерфейс МВФVideoProcessor миксера.

  2. Вызов МВФVideoProcessor::GetAvailableVideoProcessorModes. Этот метод возвращает массив идентификаторов GUID, которые определяют доступные режимы видеопроцессоров. Список возвращается в порядке убывания качества, режим с наивысшим качеством, отображаемым первым в списке. Список может изменяться в зависимости от формата видео.

  3. Для каждого GUID в списке вызовите МВФVideoProcessor::GetVideoProcessorCaps , чтобы найти возможности соответствующего режима процессора видео. Метод заполняет структуру DXVA2_VideoProcessorCaps описанием возможностей.

  4. Чтобы выбрать режим, вызовите IMFVideoProcessor::SetVideoProcessorMode. В противном случае EVR автоматически выбирает режим при запуске потоковой передачи. В этом случае можно вызвать МВФVideoProcessor::GetVideoProcessorMode , чтобы найти выбранный режим.

Большинство полей в структуре DXVA2_VideoProcessorCaps описывают поведение драйвера низкого уровня и не заинтересованы в типичном приложении. Следующие поля, скорее всего, будут интересовать:

  • DeviceCaps. Это поле указывает, выполняется ли обработка видео в оборудовании или программном обеспечении и является ли графический драйвер более старым драйвером DXVA 1.0.

  • DeinterlaceTechnology. Это поле содержит некоторые сведения о том, какой уровень качества деинтерлакации можно ожидать, если исходное видео переплетается.

  • ProcAmpControlCaps. Это поле указывает, какие элементы управления корректировкой цвета доступны. Список возможных настроек цвета см. в разделе ProcAmp Параметры. Если драйвер не может выполнить настройку цвета, это поле равно нулю.

  • VideoProcessorOperations. Это поле содержит флаги, описывающие другие возможности обработки видео. Два флага определенной важности — это флаг DXVA2_VideoProcess_SubПотоки и флаг DXVA2_VideoProcess_SubПотоки. По крайней мере один из этих флагов должен присутствовать для EVR для смешивания подпотоков на эталонный видеопоток. Если ни один флаг отсутствует, EVR ограничен одним видеопотоком.

  • NoiseFilterTechnology. Это поле указывает, какие фильтры шума поддерживаются графическим драйвером. Если драйвер не поддерживает фильтрацию шума, значение DXVA2_NoiseFilterTech_Unsupported.

  • DetailFilterTechnology. Это поле указывает, какие фильтры сведений поддерживаются графическим драйвером. Если драйвер не поддерживает фильтрацию шума, значение DXVA2_DetailFilterTech_Unsupported.

Настройка цвета и фильтрация изображений

Графический драйвер может поддерживать настройку цвета (также называемую амплификацией процесса или просто ProcAmp) и фильтрацией изображений. При выполнении GPU корректировка цвета и фильтрация изображений можно выполнять в режиме реального времени без нагрузки на ЦП.

Чтобы использовать эти функции, выполните следующие действия.

  1. Выберите режим обработки видео, как описано в предыдущем разделе.

  2. ВызовИТЕ МВФVideoProcessor::GetVideoProcessorCaps , чтобы найти возможности обработки видео, как описано в предыдущем разделе. Метод заполняет структуру DXVA2_VideoProcessorCaps , описывающую возможности, включая, поддерживает ли драйвер настройку цвета и фильтр изображений.

  3. Для каждой корректировки цвета, поддерживаемой драйвером, вызовите МВФVideoProcessor::GetProcAmpRange , чтобы найти возможный диапазон значений для этого параметра. Этот метод также возвращает значение по умолчанию для параметра. Вызовите IMFVideoProcessor::GetProcAmpValues , чтобы найти текущее значение параметров. Значения не имеют указанных единиц. Это до драйвера, чтобы определить диапазон значений.

  4. ВызовИТЕ МВФVideoProcessor::SetFilteringValue , чтобы задать значение корректировки цвета.

  5. Если драйвер поддерживает фильтрацию изображений, каждый тип фильтра (шум и детализация) поддерживает три параметра — уровень, радиус и пороговое значение — как в chroma, так и в luma. (См. раздел Фильтр изображений DXVA Параметры.) Для каждого параметра вызовите МВФVideoProcessor::GetFilteringRange, чтобы получить диапазон возможных значений и вызвать IMFVideoProcessor::GetFilteringValue, чтобы получить текущее значение.

  6. Чтобы изменить параметр фильтра изображений, вызовите МВФVideoProcessor::SetFilteringValue.

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