カスタム ミキサー

[このページで説明されているコンポーネントである拡張ビデオ レンダラーは、レガシ機能です。 これは、MediaPlayer および IMFMediaEngine コンポーネントを介して公開される単純なビデオ レンダラー (SVR) に置き換えられました。 ビデオ コンテンツを再生するには、これらのコンポーネントのいずれかにデータを送信し、新しいビデオ レンダラーをインスタンス化できるようにする必要があります。 これらのコンポーネントは、Windows 10 および Windows 11 用に最適化されています。 Windows でビデオ メディアを再生する新しいコードでは、可能な場合は、EVR ではなく、MediaPlayer または下位レベルの IMFMediaEngine API を使うことを強くお勧めします。 Microsoft は、レガシ API を使用する既存コードを、新しい API を使用するように可能であれば書き直すことを提案しています。]

このトピックでは、拡張ビデオ レンダラー (EVR) のカスタム ミキサーを作成する方法について説明します。 カスタム ミキサーは、メディア ファンデーション EVR メディア シンクまたは DirectShow EVR フィルターで使用できます。 ミキサーとプレゼンターの詳細については、「拡張ビデオ レンダラー」を参照してください。

ミキサーは、1 つ以上の入力 (参照ストリームとサブストリーム) と 1 つの出力を持つメディア ファンデーション変換 (MFT) です。 入力ストリームはアップストリームからサンプルを受け取ります。 出力ストリームはサンプルをプレゼンターに配信します。 EVR はミキサー上で IMFTransform::ProcessInput を呼び出す役割を担い、プレゼンターは IMFTransform::ProcessOutput を呼び出す役割を担います。

EVR ミキサーは少なくとも次のインターフェイスを実装する必要があります。

Interface 説明
IMFTransform 基本的な MFT 機能を提供します。
IMFTopologyServiceLookupClient ミキサーが EVR からインターフェイスを取得できるようにします。
IMFVideoDeviceID ミキサーが EVR からインターフェイスを取得できるようにします。
IMFAttributes MF_SA_D3D_AWARE 属性を EVR に公開するために使われます。

 

必要に応じて、MFT は次のインターフェイスのいずれかを実装できます。

Interface 説明
IEVRTrustedVideoPlugin 保護されたコンテンツを再生するために必要です。
IMFGetService IMFVideoMixerBitmapIMFVideoProcessor などのインターフェイスをアプリケーションに公開します。
IMFQualityAdvise 品質マネージャーがビデオ品質を調整できるようにします。
IMFVideoMixerBitmap アプリケーションが静的ビットマップをビデオにミックスできるようにします。
IMFVideoPositionMapper 出力ビデオ フレームの座標を入力ビデオ フレームの座標にマップします。
IMFVideoProcessor 一部の DXVA ビデオ処理機能をアプリケーションに公開します。

 

ミキサーとの形式に関するネゴシエーションは次のように動作します。

  1. EVR は、参照ストリームにメディアの種類を設定します。

  2. EVR は、MFVP_MESSAGE_INVALIDATEMEDIATYPE メッセージを使って、プレゼンター上で IMFVideoPresenter::ProcessMessage を呼び出します。

  3. プレゼンターは、ミキサーの出力ストリームにメディアの種類を設定します。

  4. EVR はサブストリーム上でメディアの種類を設定します。

参照ストリームのメディアの種類が変更されると、ミキサーの他のメディアの種類は無効になります。 ミキサーの IMFTransform::ProcessOutput メソッドは失敗し、MF_E_TRANSFORM_STREAM_CHANGE を返します。 プレゼンターはこの時点では何もすべきではありません。 EVR は形式に関するネゴシエーション プロセスを再度開始します。

いずれかの入力ストリームがストリームの末尾に到達すると、EVR はミキサー上で MFT_MESSAGE_NOTIFY_END_OF_STREAM を指定して IMFTransform::ProcessMessage を呼び出します。

ミキサーは、EVR の IMediaEventSink インターフェイスを使って、次のイベントを EVR に送信します。 このインターフェイスは、DirectShow SDK ドキュメントに記載されています。

イベント 説明
EC_SAMPLE_NEEDED ミキサーには新しい入力サンプルが必要です。

 

EVR は、ストリーミングを開始する前にミキサー上で ProcessOutput を呼び出す場合があります。 ミキサーはこれらの呼び出しに失敗すべきではありません。 代わりに、出力画面を黒いピクセルで塗りつぶす必要があります。 ミキサーは、MFT_MESSAGE_NOTIFY_BEGIN_STREAMING メッセージまたは ProcessInput メソッドを受信するまで、出力サンプルの色の塗りつぶしを続ける必要があります。 ミキサーが MFT_MESSAGE_NOTIFY_END_STREAMING メッセージを受信したら、色の塗りつぶしモードに戻る必要があります。

IMFVideoDeviceID の実装

IMFVideoDeviceID インターフェイスには、デバイス GUID を返す 1 つのメソッド GetDeviceID が含まれています。 デバイスGUID は、プレゼンターとミキサーが互換性のあるテクノロジを使用するようにします。 デバイス GUID が一致しない場合、EVR は初期化に失敗します。

標準ミキサーとプレゼンターはどちらも Direct3D 9 を使用し、デバイス GUID は IID_IDirect3DDevice9 と等しくなります。 標準ミキサーでカスタム プレゼンターを使用する場合は、プレゼンターのデバイス GUID を IID_IDirect3DDevice9 にする必要があります。 両方のコンポーネントを置き換える場合は、新しいデバイス GUID を定義できます。

IMFTopologyServiceLookupClient の実装

ミキサーは、IMFTopologyServiceLookupClient インターフェイスを実装する必要があります。 ストリーミングが開始される前に、EVR は IMFTopologyServiceLookupClient::InitServicePointers を呼び出し、EVR の IMFTopologyServiceLookup インターフェイスへのポインターを渡します。 ミキサーはこのポインターを使って EVR からインターフェイス ポインターを取得します。

少なくとも、ミキサーは次のインターフェイスのクエリを実行する必要があります。

EVR が IMFTopologyServiceLookupClient::ReleaseServicePointers を呼び出すと、ミキサーは呼び出しから取得したポインターを InitServicePointers に解放する必要があります。

ミキサーの属性

ミキサーは次の属性をサポートする必要があります。

属性 説明
MF_SA_D3D_AWARE ミキサーが DirectX ビデオ アクセラレーション (DXVA) をサポートするかどうかを指定します。
MF_SA_REQUIRED_SAMPLE_COUNT EVR が各ミキサー ストリームに割り当てる必要があるビデオ サンプル数。 この属性は個々のストリームに適用されます。IMFTransform::GetInputStreamAttributes から返される属性ストアを使います。

 

EVR でのミキサーの設定

EVR にカスタム ミキサーを設定するには、IMFVideoRenderer::InitializeRenderer を呼び出します。 DirectShow EVR フィルターと EVR メディア シンクの両方がこのメソッドを実装しています。

EVR ライセンス認証オブジェクト。 EVR ライセンス認証オブジェクトを使っている場合は、EVR ライセンス認証オブジェクトに次のいずれかの属性を設定することでカスタム ミキサーを指定できます。

属性 説明
MF_ACTIVATE_CUSTOM_VIDEO_MIXER_ACTIVATE ミキサーのライセンス認証オブジェクトへのポインター。 ライセンス認証オブジェクトは、IMFActivate インターフェイスを実装する必要があります。
MF_ACTIVATE_CUSTOM_VIDEO_MIXER_CLSID ミキサーの CLSID。

 

強化されたビデオ レンダラー