0

わかりました、私はしばらく探し回っていましたが、現在かなり困惑しています。これについて私が見つけることができる助けをいただければ幸いです。

複数のフィルター グラフで複数のカメラを開くアプリケーションがあります。それぞれが同じなので、そのうちの 1 つだけを説明します。大まかなアイデアは、PAL ビデオ ストリームがビデオ グラバー カードを介して読み込まれ、アプリケーションによって処理されるというものです。アプリは、DirectShow ビデオ フィルター グラフを構築します。各グラフには、ビデオ ソース、サンプル グラバー フィルター、およびヌル レンダラー フィルターが含まれています。取得したサンプルは、ビデオからのさまざまな静止画を表示し、OpenCV で描画およびスケーリングするために使用されます。したがって、現在のフィルタ グラフは次のようになります。

[Video Source] --> [/* ある種のコーデック フィルタ */] --> [Sample Grabber] --> [Null Renderer]

DirectShowがそれ自体をレンダリングできるようにするため、「何らかの」と言います。

hr = pCaptureGraphs[i]->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pSourceFilters[i], pGrabberFilters[i], pNullRendFilters[i]);

ただし、PAL ビデオからのインターレースに問題があります。FFDShow と GraphEditor アプリを使用して、上記と同様のグラフを作成しましたが、SampleGrabber の前に FFDShow フィルターを使用して、ビデオ フィードで 3 次インターレース解除を実行するように設定しました。または、それを使用して、ビデオ グラバーからのビデオ ストリームをデコードし、インターレースを解除することもできます。

私の問題はこれです: コードで FFDShow フィルターを作成する方法がわかりません。コードにフィルターを追加する方法はありますか?もしそうなら、何をプロジェクトに含めたりリンクしたりすればよいですか? または、RenderStream を呼び出すときにインターレース解除を行う FFDShow フィルターを使用するように DirectShow を構成する方法はありますか?

このトピックに関するヘルプをいただければ幸いです。

更新 1:

さて、私が開発していた PC である Windows 8.1 マシンは何らかの理由で FFDShow フィルターを実行しないことがわかりましたが、ターゲット マシンである Windows 7 マシンではまったく同じコードが問題なく実行されます。なんらかの非互換性があるようです。:/

次のフェーズに進みます。インターレース解除です。Sample Grabber フィルタとその前のフィルタ (この場合は AVI デコンプレッサ) を分離することに成功し、それらを互いに切断してから、それらの間に FFDShow 生ビデオ フィルタを接続しました。もう 1 つの FFDShow フィルターは、サンプル グラバーから出力が読み取られないというグラフを何らかの形で混乱させるため、前者のフィルターを使用します。問題は、ビデオ フィードのインターレース解除を有効にするにはどうすればよいかということです。GraphEdit プログラムで同じグラフを作成したところ、インターレースが消えたので、フィルターがそれを実行できることがわかりました。しかし、コードでそれを有効にするにはどうすればよいですか?

更新 2 / 解決策

フィルター グラフを実行し、フィルターのトレイ アイコンを選択し、アイコンを右クリックしてメニューでインターレース解除を設定することで、なんとか機能させることができました。それは完璧に機能しました。Roman R の助けに感謝します。

4

1 に答える 1

1

コードで FFDshow Video Decoder のインスタンスを作成する必要があります。

class __declspec(uuid("{04FE9017-F873-410E-871E-AB91661A4EF7}")) FfdshowVideoDecoder;
CComPtr<IBaseFilter> pBaseFilter;
HRESULT nResult = pBaseFilter.CoCreateInstance(__uuidof(FfdshowVideoDecoder));

次にIGraphBuilder::AddFilter、フィルターグラフに移動します

次に、このインスタンスから入力/出力をクエリIPinし、他のフィルターに適切に接続します。これは、GraphEdit で対話的に行う場合と同様です。RenderStreamこの IBaseFilter を中間フィルターとして使用すると、これも実行できる可能性があります。

于 2014-04-11T10:07:53.883 に答える