カスタム ミキサー
[このページで説明するコンポーネント 拡張ビデオ レンダラーは、従来の機能です。 これは、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 ビデオ処理機能をアプリケーションに公開します。 |
ミキサーとのフォーマット ネゴシエーションは次のように動作します。
EVR は、参照ストリームにメディアの種類を設定します。
EVR は、発表者 IMFVideoPresenter::P rocessMessage を MFVP_MESSAGE_INVALIDATEMEDIATYPE メッセージと共に呼び出します。
発表者は、ミキサーの出力ストリームにメディアの種類を設定します。
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。 |
関連トピック
-
拡張ビデオ レンダラー を する