私は、ユーザーが TV チューナー カードを構成するのに役立つアプリケーションに取り組んでいます。基本的に、ユーザーがデバイスを選択すると、アプリケーションが出力としてグラフ ファイル (.GRF)を生成します。ただし、ユーザーが変更できる設定がいくつかあります。これらの設定には、ビデオ規格 (PAL、NTSC、SECAM)、ビデオ入力 (チューナー、コンポジット、SVideo) などが含まれます。
GraphEdit では、目的のフィルターを右クリックし、[フィルター プロパティ...] を選択することでこれを行うことができます。ただし、コードで同じことを達成する方法がわかりません。
質問 1 : コードで DirectShow フィルターのプロパティを変更するにはどうすればよいですか?
ICaptureGraphBuilder2::RenderStreamを使用してグラフを作成するため、ソース フィルターとレンダラーへの参照のみを保持しています。変更できるようにしたいプロパティのほとんどは、RenderStream メソッドによって自動的に追加されるクロスバー フィルターなど、他のフィルターにあります。
質問 2 : グラフ内の他のフィルタへの参照を取得して、それらのプロパティを変更するにはどうすればよいですか?
注:私のアプリケーションはほとんどの TV チューナー カードで動作し、すべてのカードが異なる名前で動作するため、FindFilterByNameは使用しません。
編集: EnumFiltersを列挙することにより、これらのフィルターへの参照を取得する方法を見つけました。次に、すべてのフィルターでQueryFilterInfoを使用してその名前を見つけます。これは、FindFilterByName を使用する場合とは異なります。Contains を使用して特定の単語 ("Crossbar" など) を検索できるからです。ただし、クロスバー フィルターの名前が ("... Xbar") である例が既にあるので、これを行うためのより一般的な方法をまだ探しています。カテゴリごとにフィルターを見つけられたらいいのに...
ちなみに、私は現在DirectShow.Net ライブラリを使用していますが、アプローチは C++ ライブラリと同じである必要があると思います。ただし、私は C++ の構文を完全には理解していません。そのため、コード例を投稿 (参照) する予定がある場合は、C# または VB.NET であれば大きな助けになるでしょう。
解決策: 受け入れられた回答のコメントを参照してください。プロパティをそれぞれのインターフェイスに変更する必要があるフィルターをキャストする必要があります。たとえば、クロスバー フィルターはIAMCrossbar インターフェイスにキャストする必要があります。このインターフェイスを使用して、クロスバー関連のすべてのプロパティを変更できるようになりました。