Пользовательские миксеры

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

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

Миксер — это преобразование Media Foundation (MFT) с одним или несколькими входными данными (ссылочным потоком и вложенными потоками) и одним выходным данным. Входной поток получает образцы из вышестоящий. Выходной поток передает примеры выступающим. EVR отвечает за вызов МВФTransform::P rocessInput на миксере, и выступающий отвечает за вызов МВФTransform::P rocessOutput.

Как минимум, миксер EVR должен реализовать следующие интерфейсы:

Интерфейс Description
МВФTransform Предоставляет базовые функции MFT.
IMFTopologyServiceLookupClient Позволяет миксеру получать интерфейсы из EVR.
МВФVideoDeviceID Позволяет миксеру получать интерфейсы из EVR.
МВФAttributes Используется для предоставления атрибута MF_SA_D3D_AWARE evR.

 

При необходимости MFT может реализовать любой из следующих интерфейсов:

Интерфейс Description
IEVRTrustedVideoPlugin Требуется для воспроизведения защищенного содержимого.
МВФGetService Предоставляет интерфейсы, такие как IMFVideoMixerBitmap и IMFVideoProcessor для приложения.
МВФQualityAdvise Позволяет диспетчеру качества настроить качество видео.
МВФVideoMixerBitmap Позволяет приложению смешивать статический растровый рисунок с видео.
МВФVideoPositionMapper Карты координаты выходного видеокадров для координат входного видеокадры.
МВФВидеоПроцессор Предоставляет некоторые функции обработки видео DXVA для приложения.

 

Согласование формата с миксером работает следующим образом:

  1. EVR задает тип носителя в эталонном потоке.

  2. EVR вызывает МВФVideoPresenter::P rocessMessage на докладчика с сообщением MFVP_MESSAGE_INVALIDATEMEDIATYPE.

  3. Выступающий задает тип носителя в выходном потоке миксера.

  4. EVR задает тип носителя в подпотоках.

Если тип носителя в эталонном потоке изменяется, другие типы носителей миксера больше не допустимы. Метод IMFTransform::P rocessOutput миксера завершится ошибкой и возвратом MF_E_TRANSFORM_STREAM_CHANGE. Выступающий не должен ничего делать на этом этапе. EVR снова инициирует процесс согласования формата.

Когда любой входной поток достигает конца потока, EVR вызывает МВФTransform::P rocessMessage на миксере с MFT_MESSAGE_NOTIFY_END_OF_STREAM.

Миксер отправляет следующие события в EVR с помощью интерфейса IMediaEventSink EVR. Этот интерфейс описан в документации по пакету SDK DirectShow.

Мероприятие Description
EC_SAMPLE_NEEDED Для миксера требуется новый входной пример.

 

EVR может вызвать ProcessOutput на миксере перед запуском потоковой передачи. Миксер не должен завершать эти вызовы. Вместо этого он должен заполнить выходную поверхность черными пикселями. Миксер должен продолжать использовать выходные образцы цветовой заливки, пока он не получит сообщение MFT_MESSAGE_NOTIFY_BEGIN_STREAMING или метод ProcessInput. Если миксер получает сообщение MFT_MESSAGE_NOTIFY_END_STREAMING, он должен вернуться в режим заливки цвета.

Реализация МВФVideoDeviceID

Интерфейс IMFVideoDeviceID содержит один метод GetDeviceID, который возвращает GUID устройства. GUID устройства гарантирует, что выступающий и миксер используют совместимые технологии. Если идентификаторы guid устройства не соответствуют, EVR не может инициализировать.

Стандартный миксер и выступающий используют Direct3D 9 с GUID устройства, равным IID_IDirect3DDevice9. Если вы планируете использовать пользовательский выступающий со стандартным миксером, идентификатор GUID устройства докладчика должен быть IID_IDirect3DDevice9. При замене обоих компонентов можно определить новый GUID устройства.

Реализация IMFTopologyServiceLookupClient

Миксер должен реализовать интерфейс IMFTopologyServiceLookupClient. Перед началом потоковой передачи EVR вызывает МВФTopologyServiceLookupClient::InitServicePointers и передает указатель на интерфейс IMFTopologyServiceLookup EVR. Этот указатель используется для получения указателей интерфейса из EVR.

По крайней мере миксер должен запрашивать следующий интерфейс:

Когда EVR вызывает МВФTopologyServiceLookupClient::ReleaseServicePointers, миксер должен освободить все указатели, полученные от вызова InitServicePointers.

Атрибуты миксера

Миксер должен поддерживать следующие атрибуты.

Атрибут Description
MF_SA_D3D_AWARE Указывает, поддерживает ли средство смешивание видео DirectX (DXVA).
MF_SA_REQUIRED_SAMPLE_COUNT Количество примеров видео, которые EVR должен выделять для каждого потока микшера. Этот атрибут применяется к отдельным потокам; используйте хранилище атрибутов, возвращаемое МВФTransform::GetInputStreamAttributes.

 

Настройка миксера в EVR

Чтобы задать настраиваемый миксер в EVR, вызовите МВФVideoRenderer::InitializeRenderer. Фильтр DirectShow EVR и приемник мультимедиа EVR реализуют этот метод.

Объект активации EVR. Если вы используете объект активации EVR, можно предоставить пользовательский миксер, задав один из следующих атрибутов для объекта активации EVR:

Атрибут Description
MF_ACTIVATE_CUSTOM_VIDEO_MIXER_ACTIVATE Указатель на объект активации для миксера. Объект активации должен реализовать интерфейс IMFActivate.
MF_ACTIVATE_CUSTOM_VIDEO_MIXER_CLSID CLSID миксера.

 

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