手順 1. 基底クラスを選択する
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]
これは、 変換フィルターの作成に関するチュートリアルの手順 1 です。
DMO ではなくフィルターを記述することを決定した場合、最初の手順は、使用する基底クラスを選択することです。 変換フィルターには、次のクラスが適しています。
CTransformFilter は、個別の入力バッファーと出力バッファーを使用する変換フィルター用に設計されています。 この種のフィルターは、コピー変換フィルターと呼ばれることもあります。 コピー変換フィルターは、入力サンプルを受け取ると、新しいデータを出力サンプルに書き込み、出力サンプルを次のフィルターに配信します。
CTransInPlaceFilter は、元のバッファー内のデータを変更するフィルター (インプレース トランスイン フィルターとも呼ばれます) 用に設計されています。 インプレース 変換フィルターは、サンプルを受け取ると、そのサンプル内のデータを変更し、同じサンプルをダウンストリームに配信します。 フィルターの入力ピンと出力ピンは、常に一致するメディアの種類に接続されます。
CVideoTransformFilter は、主にビデオ デコーダー用に設計されています。 CTransformFilter から派生しますが、ダウンストリーム レンダラーが遅れた場合にフレームを削除する機能が含まれています。
CBaseFilter は汎用フィルター クラスです。 この一覧の他のクラスはすべて 、CBaseFilter から派生します。 いずれも適していない場合は、このクラスにフォールバックできます。 ただし、このクラスには、自分の部分で最も多くの作業が必要です。
![重要]
インプレース ビデオ変換は、レンダリング パフォーマンスに重大な影響を与える可能性があります。 インプレース変換では、バッファーに対する読み取り/変更/書き込み操作が必要です。 メモリがグラフィックス カードに存在する場合、読み取り操作は大幅に遅くなります。 また、コピー変換であっても、慎重に実装しないと意図しない読み取り操作が発生する可能性があります。 そのため、ビデオ変換を記述する場合は、常にパフォーマンス テストを行う必要があります。
RLE エンコーダーの例では、最適な選択肢は CTransformFilter または CVideoTransformFilter です。 実際、それらの違いは主に内部的であるため、一方から他方への変換が簡単です。 メディアの種類は 2 つのピンで異なる必要があるため、このフィルターには CTransInPlaceFilter クラスは適していません。 この例では、 CTransformFilter を使用します。
次へ: 手順 2.フィルター クラスを宣言します。
関連トピック