2

私は、ユーザーが 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 インターフェイスにキャストする必要があります。このインターフェイスを使用して、クロスバー関連のすべてのプロパティを変更できるようになりました。

4

3 に答える 3

4

2 -EnumFilters正しいアプローチです。名前は、グラフ内のフィルターを簡単に区別できるように開発者にやさしくすることのみを目的としているため、信頼するべきではありませんが、グローバルに永続的で一貫性があるとは約束されていません。ピン名も同様です。

1 - ネイティブ API では、機能を持つプロパティ ページで UI を作成しOleCreatePropertyFrameます。これについては、フィルターのプロパティ ページの表示も参照してください。

DirectShow.NET にはラッパーがないと思うので、次のように P/Invoke 経由でこの API を呼び出す必要があります。C# : directshow.net を使用してこのダイアログを表示する方法は?

設定はフィルター固有であり、通常はプライベート インターフェイスを介して公開されるため、均一なアクセスはありません。それでも、フィルターがストリームからの読み込み/ストリームへの保存をサポートしている場合は、設定を統一された方法で一度に保存/復元できます。GraphEdit が .GRF ファイルを保存/ロードする方法。

于 2012-11-14T09:54:51.640 に答える
0

2 - IMoniker フィルターによって提供される DeviceName を調べてみましたか? 個人的には、フィルターをブラックリストに登録するのに非常に便利であることがわかりました。その IMoniker::DeviceName を介して、デバイスの種類について少し知ることができるようです。あなたのニーズを満たすのに十分な情報かどうかはわかりませんが、それは出発点かもしれません.

于 2013-02-14T13:36:03.023 に答える
0

質問 1 では、自動挿入されたクロスバー フィルターを「検索」するには、ICaptureGraphBuilder2::FindInterface を使用します。その後、ネイティブ プロパティ ページの「GUI ポップアップ」を表示し (Roman の回答を参照)、ユーザーがそれを使用してそれを制御できるようにするか、通常のクロスバー列挙/選択 API をプログラムで実行します。

于 2015-04-14T13:22:33.913 に答える