ビデオ ミキサー コントロールの使用
[このページで説明されているコンポーネントである拡張ビデオ レンダラーは、レガシ機能です。 これは、MediaPlayer および IMFMediaEngine コンポーネントを介して公開される単純なビデオ レンダラー (SVR) に置き換えられました。 ビデオ コンテンツを再生するには、これらのコンポーネントのいずれかにデータを送信し、新しいビデオ レンダラーをインスタンス化できるようにする必要があります。 これらのコンポーネントは、Windows 10 および Windows 11 用に最適化されています。 Windows でビデオ メディアを再生する新しいコードでは、可能な場合は、EVR ではなく、MediaPlayer または下位レベルの IMFMediaEngine API を使うことを強くお勧めします。 Microsoft は、レガシ API を使用する既存コードを、新しい API を使用するように可能であれば書き直すことを提案しています。]
EVR ミキサーは、ミキサーでビデオを処理する方法を制御するためにアプリケーションで使用できるインターフェイスがいくつか提供されています。 これらのインターフェイスは、DirectShow またはメディア ファンデーションで使用できます。
Interface | 説明 |
---|---|
IMFVideoMixerBitmap インターフェイス | 静的ビットマップ画像をビデオにアルファ ブレンドします。 |
IMFVideoMixerControlインターフェイス | EVR でビデオ サブストリームをミックスする方法を制御します。 |
IMFVideoProcessor インターフェイス | 色調整、画像フィルター、その他のビデオ処理機能を制御します。 このインターフェイスでは、グラフィックス ドライバーによって実装される機能へのアクセスが提供されるため、正確な機能はユーザーのグラフィックス ドライバーによって異なります。 |
これらのインターフェイスへのポインターを取得する正しい方法は、EVR の DirectShow バージョンとメディア ファンデーション バージョンのどちらを使用しているかによって異なります。 メディア ファンデーション EVR の場合、EVR を直接使用するか、メディア セッションを通じて使用するかによっても異なります。 (通常、アプリケーションは直接ではなく、メディア セッション経由で EVR を使用します)。
これらのインターフェイスへのポインターを取得するには、次の手順を実行します。
EVR の IMFGetService インターフェイスへのポインターを取得します。
DirectShow EVR フィルターを使用している場合は、フィルターで QueryInterface を呼び出します。
EVR メディア シンクを直接使用している場合は、メディア シンクで QueryInterface を呼び出します。
メディア セッションを使用している場合は、メディア セッションで QueryInterface を呼び出します。
メディア セッションを使用している場合は、メディア セッションが状態値 MF_TOPOSTATUS_READY を含む MESessionTopologyStatus イベントを送信するまで待機します。 (メディア セッションを使用しない場合は、この手順をスキップします。)
IMFGetService::GetService を呼び出して、ミキサー インターフェイスを取得します。 サービス識別子r MR_VIDEO_MIXER_SERVICE を使用します。
ビットマップをビデオにアルファ ブレンドする
再生中に静的ビットマップをビデオにアルファ ブレンドするために IMFVideoMixerBitmap インターフェイスを使用できます。 ビットマップは、IDirect3DSurface9 ポインターとして指定された Direct3D サーフェイスに格納することも、GDI ビットマップを使用することもできます。
ビットマップに Direct3D サーフェスを使用する場合、サーフェスにはピクセル単位のアルファ データを含めることができます。これは、ミキサーが画像をアルファ ブレンドする場合に使用されます。 または、カラー キー (ビットマップ内のどこに表示される場合でも透明になる単一の色) を定義することもできます。 また、画像全体に適用されるアルファ値を指定することもできます。 また、ビットマップをトリミングするソース四角形と、ビデオ フレーム内にビットマップを配置する目的地四角形を設定することもできます。
ビットマップを設定するには、IMFVideoMixerBitmap::SetAlphaBitmap を呼び出します。 このメソッドでは、ビットマップとアルファ ブレンド パラメーターを指定する MFVideoAlphaBitmap 構造体へのポインターを受け取ります。 コード例については、SetAlphaBitmap メソッドの参照先のトピックを参照してください。
ビットマップを設定した後、IMFVideoMixerBitmap::UpdateAlphaBitmapParameters を呼び出すことによって、ソース四角形や目的地四角形などのブレンド パラメーターを更新できます。 更新は次のビデオ フレームで有効になります。 更新を行うには、ビデオを再生している必要があります。 このメソッドを使用すると、ビットマップで簡単なアニメーションを実行できます。 (より高度な効果が必要な場合は、カスタム EVR ミキサーを記述することを検討してください。)
ビットマップをクリアするには、IMFVideoMixerBitmap::ClearAlphaBitmap を呼び出します。
サブストリームの制御
EVR は、プライマリ ビデオ ストリームに 1 つ以上のビデオ サブストリームを組み合わせることができます。 サブストリームの混在を制御するには、IMFVideoMixerControl インターフェイスを使用します。
IMFVideoMixerControl::SetStreamOutputRect を呼び出して、複合ビデオ フレーム内のサブストリームの位置を設定します。
IMFVideoMixerControl::SetStreamZOrder を呼び出して、サブストリームの Z オーダーを設定します。 EVR は、0 から始まる Z オーダー値の順序でビデオ ストリームを描画します。 プライマリ ビデオ ストリームは常に Z オーダーで最初に表示されます。
ビデオ プロセッサ設定
EVR ミキサーは、DirectX ビデオ アクセラレーション (DXVA) を使用して、入力ストリームでビデオ処理を行います。 正確な処理機能は、グラフィックス ドライバーによって異なります。 ビデオ処理機能は、DXVA2_VideoProcessorCaps 構造体を使用して記述されます。 特定の機能セットはビデオ処理モードと呼ばれ、各モードは GUID によって識別されます。 事前定義済みの GUID の一覧については、「IDirectXVideoProcessorService::GetVideoProcessorDeviceGuids」を参照してください。 ドライバーでは、さまざまな機能の組み合わせを表す、ベンダー固有の GUID を追加で定義できます。
サポートされているモードと各モードの機能を確認するには、次の操作を行います。
IMFGetService::GetService を呼び出して、ミキサーの IMFVideoProcessor インターフェイスへのポインターを取得します。
IMFVideoProcessor::GetAvailableVideoProcessorModes を呼び出します。 このメソッドは、使用可能なビデオ プロセッサ モードを識別する GUID の配列を返します。 リストは品質の高い順に返され、最も品質の高いモードが一覧の最初に表示されます。 一覧は、ビデオの形式に応じて変更できます。
一覧の GUID ごとに IMFVideoProcessor::GetVideoProcessorCaps を呼び出して、対応するビデオ プロセッサ モードの機能を見つけます。 このメソッドでは、DXVA2_VideoProcessorCaps 構造体に機能の説明が入力されます。
モードを選択するには、IMFVideoProcessor::SetVideoProcessorMode を呼び出します。 それ以外の場合、ストリーミングの開始時に EVR でモードが自動的に選択されます。 その場合は、IMFVideoProcessor::GetVideoProcessorMode を呼び出して、選択されたモードを見つけることができます。
DXVA2_VideoProcessorCaps 構造体のほとんどのフィールドでは、低レベルのドライバーの動作を記述し、一般的なアプリケーションの目的ではありません。 最も目的に近いフィールドは次のとおりです。
DeviceCaps。 このフィールドは、ビデオ処理がハードウェアまたはソフトウェアで実行されるかどうか、およびグラフィックス ドライバーが古い DXVA 1.0 ドライバーであるかどうかを示します。
DeinterlaceTechnology。 このフィールドは、ソース ビデオがインターレースされている場合に期待できるインターレース解除品質のレベルを示します。
ProcAmpControlCaps。 このフィールドでは、使用できる色補正コントロールを指定します。 可能な色補正の一覧については、「ProcAmp 設定」を参照してください。 ドライバーが色補正を実行できない場合、このフィールドは 0 です。
VideoProcessorOperations。 このフィールドには、その他のビデオ処理機能を記述するフラグが含まれています。 特に重要な 2 つのフラグは、DXVA2_VideoProcess_SubStreams フラグと DXVA2_VideoProcess_SubStreams フラグです。 EVR が参照ビデオ ストリームにサブストリームを混在させるには、これらのフラグの少なくとも 1 つが存在する必要があります。 どちらのフラグも存在しない場合、EVR は 1 つのビデオ ストリームに制限されます。
NoiseFilterTechnology。 このフィールドは、グラフィックス ドライバーでサポートされているノイズ フィルターを示します。 ドライバーがノイズ フィルター処理をサポートしていない場合、値は DXVA2_NoiseFilterTech_Unsupported です。
DetailFilterTechnology。 このフィールドは、グラフィックス ドライバーでサポートされている詳細なフィルターを示します。 ドライバーがノイズ フィルター処理をサポートしていない場合、値は DXVA2_DetailFilterTech_Unsupported です。
色補正と画像フィルター処理
グラフィックス ドライバーは、色補正 (プロセスの増幅または単に ProcAmp とも呼ばれます) と画像フィルター処理をサポートする場合があります。 GPU で実行すると、色補正と画像フィルター処理を CPU オーバーヘッドなしでリアルタイムで実行できます。
これらの機能を使用するには、次の手順を実行します。
前のセクションで説明したように、ビデオ処理モードを選択します。
IMFVideoProcessor::GetVideoProcessorCaps を呼び出して、前のセクションで説明したようにビデオ処理機能を見つけます。 このメソッドでは、ドライバーが色補正と画像フィルター処理をサポートしているかどうかなど、機能を説明する DXVA2_VideoProcessorCaps 構造体が入力されます。
ドライバーでサポートされている色補正ごとに IMFVideoProcessor::GetProcAmpRange を呼び出して、その設定で使用可能な範囲の値を見つけます。 このメソッドは、設定の既定値も返します。 IMFVideoProcessor::GetProcAmpValues を呼び出して、設定の現在の値を見つけます。 値に単位が指定されていません。 値の範囲を定義するのはドライバー次第です。
IMFVideoProcessor::SetFilteringValue を呼び出して、色補正値を設定します。
ドライバーが画像フィルター処理をサポートしている場合、各フィルターの種類 (ノイズと詳細) では、レベル、半径、しきい値の 3 つの設定が、彩度と輝度の両方でサポートされます。 (「DXVA 画像フィルター設定」参照。)設定ごとに、IMFVideoProcessor::GetFilteringRange を呼び出して使用可能な範囲の値を取得し、IMFVideoProcessor::GetFilteringValue を呼び出して現在の値を取得します。
画像フィルター設定を変更するには、IMFVideoProcessor::SetFilteringValue を呼び出します。
関連トピック