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


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

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

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

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

 

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

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

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

    • Если вы используете фильтр DirectShow EVR, вызовите метод QueryInterface для этого фильтра.

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

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

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

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

Альфа-наложение битмапа на видеоизображение

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

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

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

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

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

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

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

  • Вызовите IMFVideoMixerControl::SetStreamOutputRect, чтобы задать положение подпотока в составном кадре видео.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  4. Вызовите IMFVideoProcessor::SetFilteringValue, чтобы задать значение корректировки цвета.

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

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

усовершенствованный видеопроцессор