次の方法で共有


カスタム ミキサー

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

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

ミキサーは、1 つ以上の入力 (参照ストリームとサブストリーム) と 1 つの出力を持つ Media Foundation 変換 (MFT) です。 入力ストリームはアップストリームからサンプルを受け取ります。 出力ストリームは、発表者にサンプルを配信します。 EVR はミキサー IMFTransform::P rocessInput を呼び出す役割を担い、発表者は IMFTransform::P rocessOutput呼び出す役割を担います。

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

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

 

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

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

 

ミキサーとのフォーマット ネゴシエーションは次のように動作します。

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

  2. EVR は、発表者 IMFVideoPresenter::P rocessMessageMFVP_MESSAGE_INVALIDATEMEDIATYPE メッセージと共に呼び出します。

  3. 発表者は、ミキサーの出力ストリームにメディアの種類を設定します。

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

参照ストリームのメディアタイプが変更された場合、ミキサーの他のメディアタイプは無効になります。 ミキサーの IMFTransform::P rocessOutput メソッドは失敗し、MF_E_TRANSFORM_STREAM_CHANGEを返します。 発表者は、この時点では何もしないでください。 EVR はフォーマット ネゴシエーション プロセスを再度開始します。

任意の入力ストリームがストリームの末尾に達すると、EVR は MFT_MESSAGE_NOTIFY_END_OF_STREAMを使用してミキサー IMFTransform::P rocessMessage を呼び出します。

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

出来事 形容
EC_SAMPLE_NEEDED ミキサーには新しい入力サンプルが必要です。

 

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

IMFVideoDeviceID の実装

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

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

IMFTopologyServiceLookupClient の実装

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

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

  • IMediaEventSink

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

Mixer 属性

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

属性 形容
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。

 

拡張ビデオ レンダラー する