2

現在、Windows Media Foundation を扱っています。ただし、Microsoft H.264 デコーダーに問題があり、カスタム フォーマット用のデコーダーが欠落しているため、CLSID を使用して直接 DirectShow デコーダーをインスタンス化し、その周りに IMFTransform を公開するプロキシを構築することが可能かどうかを知りたいです。 Media Foundation のデコーダーを取得します。だからここに私の質問があります:

Directshow フィルター (できればデコーダー) を直接インスタンス化し、それらをデコードに使用して (つまり、いくつかの圧縮フレームを配置し、非圧縮フレームを取得して) MFT を作成できますか?

CLSID を使用してフィルター自体をインスタンス化する方法を知っています。ただし、実際のデコード機能の使用方法はわかりません。

どんなアイデアでも、ヒントでも、リンクでも何でも構いません。ありがとう、

J.

4

2 に答える 2

5

(免責事項:私は実際にこれを行ったことはありませんが、技術的にできない理由はないと思います.YMMV)

デコーダーが DMO フィルターの場合は、はるかに簡単になります。つまり、 IMediaObjectを介して対話できます。これは、DirectShow が DMO を使用する方法と大差ありません。メディア タイプのネゴシエーションとサンプルの受け渡しを処理する別の変換フィルターで DMO をラップするだけですが、独自のアプリケーションでこれを行うことを実際に妨げるものは何もありません。

問題が 1 つあります。IMediaObject::ProcessInput と IMediaObject::ProcessOutput には、 IMediaBuffer を実装する独自のバッファ クラスが必要です。しかし、これは非常に基本的なインターフェースなので、実装にそれほど苦労することはないと思います。これが基本的な実装です。

通常の DirectShow フィルターの場合、ほとんどの DirectShow フィルターは利用可能な外部グラフの存在に依存しているため、実際にははるかに困難になります (適切な例: すべての directshow イベントは、このグラフの存在を前提としています)。単一の DShow フィルターをスタンドアロンで本当に使用したい場合は、おそらくフィルター グラフ全体をラップしてから、サンプルをフィードするためのカスタム ソース フィルターを用意する必要があります。サンプル グラバー (またはカスタム レンダー フィルター) を使用して、サンプルをグラフからヤンクして、アプリケーションの残りの部分に公開します。(このグラフを DMO フィルタの実装でラップし、IMediaObject を使用してそれと対話するというクレイジーなアイデアもありますが、これは難しいかもしれません)

幸いなことに、ほとんどのデコーダーは DMO フィルターとして実装される傾向があるため、IMediaObject をそのまま使用できる可能性が高いと思います。

于 2010-12-21T18:42:52.210 に答える
2

なぜあなたがこれをしたいのかわからない。フィルターがグラフの外にあることは本当に必要ありません。

従来のファイル/ネットワーク ソース フィルター、または従来のレンダラーを使用したくない場合は、バッファー レンダラーとバッファー ソース フィルターを記述して、ポインターを渡し、そこからポインターを取得できます。次に、混乱全体をグラフにドロップして実行し、他に何もせずにデコーダーをほとんど直接使用できます。これは難しいことではありません。ただし、デコーダーはおそらく PES パケット ストリームを予期しています。

于 2011-10-15T23:43:35.307 に答える