グラフ作成の概要
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]
フィルター グラフを作成するには、まずフィルター グラフ マネージャーのインスタンスを作成します。
IGraphBuilder* pIGB;
HRESULT hr = CoCreateInstance(CLSID_FilterGraph,
NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder,
(void **)&pIGB);
Filter Graph Manager では、次のグラフ構築方法がサポートされています。
- IFilterGraph::ConnectDirect は、2 つのピン間の直接接続を試みます。 ピンが接続できない場合、 メソッドは失敗します。
- IGraphBuilder::Connect は 2 つのピンを接続します。 可能であれば、直接接続します。 それ以外の場合は、中間フィルターを使用して接続を完了します。
- IGraphBuilder::Render は 出力ピンから始まり、残りのグラフをビルドします。 このメソッドは、レンダラー フィルターに到達するまで、必要に応じてフィルターを追加し、ダウンストリームで動作します。
- IGraphBuilder::RenderFile は、完全なファイル再生グラフを構築します。
- IFilterGraph::AddFilter は、グラフにフィルターを追加します。 フィルターは接続されません。 このメソッドを呼び出す前に、 CoCreateInstance を呼び出すか、フィルター マッパーまたはシステム デバイス列挙子を使用して、フィルターを作成する必要があります。
これらのメソッドは、グラフを構築するための 3 つの基本的なアプローチを提供します。
- フィルター グラフ マネージャーは、グラフ全体を構築します。
- フィルター グラフ マネージャーは、グラフの一部を構築します。
- アプリケーションによってグラフ全体がビルドされます。
フィルター グラフ マネージャーは、グラフ全体を構築します
認識された形式 (AVI、MPEG、WAV、MP3 など) で作成されたファイルを再生するだけの場合は、 RenderFile メソッドを使用します。 ファイル の再生方法に関する記事では、 これを行う方法を示します。
RenderFile メソッドは、まず、ファイルを解析できるソース フィルターをレジストリで探します。 プロトコル (URL の " https://
" など)、ファイル拡張子、またはファイル内の定義済みのバイト パターンを使用して、ソース フィルターを決定します。 詳細については、「 カスタム ファイルの種類の登録」を参照してください。
グラフの残りの部分を作成するために、フィルター グラフ マネージャーは反復的なプロセスを使用します。このプロセスでは、フィルターがサポートするメディアの種類を出力ピンで受け取り、そのメディアの種類を入力として受け入れるフィルターをレジストリで検索します。 いくつかの条件を使用して検索を絞り込み、フィルターに優先順位を付けます。
- フィルター カテゴリは、フィルターの一般的な機能を識別します。
- メディアの種類は、フィルターが入力として受け入れるか、出力として配信できるデータの種類を表します。
- メリットによって、フィルターの試行順序が決まります。 同じフィルター カテゴリ内の 2 つのフィルターがどちらも同じ入力の種類をサポートしている場合、フィルター グラフ マネージャーは、最も高いメリット値を持つフィルターを選択します。 一部のフィルターには、特殊な目的のために設計されており、アプリケーションによってのみグラフに追加する必要があるため、意図的に低いメリット値が与えられます。
Filter Graph Manager は、 Filter Mapper オブジェクトを使用してレジストリを検索します。
各フィルターが追加されると、フィルター グラフ マネージャーは、前のフィルターの出力ピンに接続しようとします。 フィルターはネゴシエートして、接続できるかどうかを判断し、接続に使用するメディアの種類を決定します。 新しいフィルターが接続できない場合、フィルター グラフ マネージャーはそれを破棄し、別のフィルターを試みます。 このプロセスは、すべてのストリームがレンダリングされるまで続行されます。
フィルター グラフ マネージャーは、グラフの一部を構築します
単にファイルを再生するだけでなく何かを行うには、アプリケーションで少なくとも一部のグラフ作成作業を実行する必要があります。 たとえば、ビデオ キャプチャ アプリケーションでは、キャプチャ ソース フィルターを選択してグラフに追加する必要があります。 AVI ファイルにデータを書き込む場合は、AVI Mux フィルターとファイル ライター フィルターをグラフに追加する必要があります。 ただし、多くの場合、フィルター グラフ マネージャーでグラフを完成させることができる場合があります。 たとえば、Render メソッドを呼び出すことで、プレビュー用のピンを レンダリング できます。
アプリケーションによってグラフ全体がビルドされる
一部のシナリオでは、アプリケーションで各フィルターを追加して接続してグラフを作成する必要がある場合があります。 この場合、グラフに追加するフィルターを具体的に把握している可能性があります。 この方法では、アプリケーションは AddFilter を呼び出して各フィルターを追加し、フィルターのピンを列挙し、 Connect または ConnectDirect を呼び出して接続します。
関連トピック