次の方法で共有


ピンの再接続

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

ピン接続中に、フィルターは次のように他のピンの 1 つを切断して再接続できます。

  1. フィルターは、もう一方のフィルターのピンで IPin::QueryAccept を呼び出し、新しいメディアの種類を指定します。
  2. QueryAccept から S_OKが返された場合、フィルターは IFilterGraph2::ReconnectEx を呼び出してピンを再接続します。

フィルターでピンを再接続する必要がある場合の例を次に示します。

  • ティー フィルター。 ティー フィルターは、ストリーム内のデータを変更せずに、入力ストリームを複数の出力に分割します。 ティー フィルターは、さまざまな種類のメディアを受け入れることはできますが、種類はすべてのピン接続で一致している必要があります。 そのため、入力ピンが接続されると、フィルターは出力ピン上の既存の接続を再ネゴシエーションする必要があり、その逆も必要になる場合があります。 例については、「 InfTee フィルター サンプル」を参照してください。
  • インプレース変換フィルター。 インプレース変換フィルターは、データを別の出力バッファーにコピーするのではなく、元のバッファー内の入力データを変更します。 インプレーストランスフィルターでは、アップストリーム接続とダウンストリーム接続の両方に同じアロケーターを使用する必要があります。 接続する最初のピン (入力または出力) は、通常の方法でアロケーターをネゴシエートします。 ただし、他のピンが接続すると、最初のアロケーターが受け入れられない可能性があります。 その場合、2 番目のピンは別のアロケーターを選択し、最初のピンは新しいアロケーターを使用して再接続します。 実装例については、 CTransInPlaceFilter クラスを 参照してください。

ReconnectEx メソッドでは、Filter Graph Manager はピンを非同期的に切断して再接続します。 QueryAccept がS_OKを返さない限り、フィルターは再接続を試みてはいけません。 それ以外の場合、ピンは切断したままになり、グラフ エラーが発生します。 また、フィルターは、同じスレッド上の IPin::Connect メソッド内から再接続を要求する必要があります。 Connect メソッドが 1 つのスレッドでを返し、別のスレッドが再接続要求を行う場合、Filter Graph Manager は再接続を行う前にグラフを実行し、グラフ エラーが発生する可能性があります。