DirectShow フィルター開発の概要

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]

このセクションでは、カスタム DirectShow フィルターの開発に関連するタスクについて簡単に説明します。 また、これらのタスクについて詳しく説明するトピックへのリンクも提供します。 このセクションを読む前に、「 DirectShow について」のトピックを参照してください。このトピックでは、DirectShow アーキテクチャ全体について説明します。

DirectShow 基本クラス ライブラリ

DirectShow SDK には、フィルターを記述するための一連の C++ クラスが含まれています。 これらは必須ではありませんが、これらのクラスは新しいフィルターを記述するための推奨される方法です。 基本クラスを使用するには、「 DirectShow フィルターのビルド」で説明されているように、それらを静的ライブラリにコンパイルし、.lib ファイルをプロジェクトにリンクします。

基底クラス ライブラリは、フィルターのルート クラス である CBaseFilter クラスを定義します。 他のいくつかのクラスは CBaseFilter から派生し、特定の種類のフィルターに特化されています。 たとえば、 CTransformFilter クラスは変換フィルター用に設計されています。 新しいフィルターを作成するには、フィルター クラスの 1 つから継承するクラスを実装します。 たとえば、クラス宣言は次のようになります。

class CMyFilter : public CTransformFilter
{
private:
    /* Declare variables and methods that are specific to your filter.
public:
    /* Override various methods in CTransformFilter */
};

DirectShow 基本クラスの詳細については、次のトピックを参照してください。

ピンの作成

フィルターは 1 つ以上のピンを作成する必要があります。 ピンの数はデザイン時に固定することも、フィルターによって必要に応じて新しいピンを作成することもできます。 通常、ピンは CBasePin クラスから派生するか、 CBaseInputPin などの CBasePin を継承するクラスから派生 します。 フィルターのピンは、フィルター クラスのメンバー変数として宣言する必要があります。 一部のフィルター クラスでは既にピンが定義されていますが、フィルターが CBaseFilter から直接継承されている場合は、派生クラスでピンを宣言する必要があります。

ピン接続のネゴシエート

フィルター グラフ マネージャーが 2 つのフィルターを接続しようとすると、ピンはさまざまなことに同意する必要があります。 接続できない場合、接続の試行は失敗します。 一般に、ピンは次のようにネゴシエートします。

  • Transport。 トランスポートは、フィルターが出力ピンから入力ピンにメディア サンプルを移動するために使用するメカニズムです。 たとえば、 IMemInputPin インターフェイス ("プッシュ モデル") または IAsyncReader インターフェイス ("pull model") を使用できます。
  • メディアの種類。 ほぼすべてのピンは、メディアの種類を使用して、提供するデータの形式を記述します。
  • アロケーター。 アロケーターは、データを保持するバッファーを作成するオブジェクトです。 ピンは、アロケーターを提供するピンに同意する必要があります。 また、バッファーのサイズ、作成するバッファーの数、およびその他のバッファー プロパティについても一致する必要があります。

基底クラスは、これらのネゴシエーションのフレームワークを実装します。 基本クラスのさまざまなメソッドをオーバーライドして、詳細を完了する必要があります。 オーバーライドする必要があるメソッドのセットは、クラスとフィルターの機能によって異なります。 詳細については、「 フィルターの接続方法」を参照してください。

データの処理と配信

ほとんどのフィルターの主な機能は、メディア データを処理して配信することです。 その発生方法は、フィルターの種類によって異なります。

  • プッシュ ソースには、サンプルにデータを継続的に入力し、ダウンストリームに配信するワーカー スレッドがあります。
  • プル ソースは、ダウンストリームネイバーがサンプルを要求するまで待機します。 サンプルにデータを書き込み、ダウンストリーム フィルターにサンプルを配信することで応答します。 ダウンストリーム フィルターは、データ フローを駆動するスレッドを作成します。
  • 変換フィルターには、アップストリーム ネイバーによってサンプルが配信されます。 サンプルを受け取ると、データが処理され、ダウンストリームに配信されます。
  • レンダラー フィルターはアップストリームからサンプルを受け取り、タイム スタンプに基づいてレンダリングするようにスケジュールします。

ストリーミングに関連するその他のタスクには、グラフからのデータのフラッシュ、ストリームの末尾の処理、シーク要求への応答などがあります。 これらの問題の詳細については、次のトピックを参照してください。

COM のサポート

DirectShow フィルターは COM オブジェクトであり、通常は DLL にパッケージ化されます。 基本クラス ライブラリは、COM をサポートするためのフレームワークを実装します。 「 DirectShow と COM」セクションで説明されています。

DirectShow フィルターの作成