2011-06-27 22 views
0

私はアプリケーションを持っています。私は、コード化されたバイトの大きな配列を受け取る状況があります。私はそれらをデコードしてレンダリングしなければならない。デコードのために、カスタムデコーダクラスを使用しています。デコード後、どのようにしてデコーダからの入力データを受け取るDirectShowグラフを作成できますか?これに関するいくつかの方向性/サンプルを与えてください。DirectShowを使用してソケット/アプリケーションからバイト配列をレンダリングする方法は?

答えて

2

DirectShow SDKのPushSourceサンプルを見てください。このサンプルはレンダリング可能なソースフィルタを作成する方法を示しています。残りのグラフを表示できるように、フィルタの出力メディアの種類を正しく設定することが重要です。このサンプルでは、​​メディアサンプルを他のメディアパイプラインにフィードする方法も示しています。あなたのケースでは何をデコードするのですか? PushSourceサンプルはRGB24 IIRCを出力します。

また、バイトを受信したのと同じフィルタでデコードしているようですね。通常、DirectShowでは、ネットワークからバイトを受け取ることができ、エンコードされた形式でサンプルを出力するソースフィルタを作成します。このフィルタをカスタムデコーダフィルタに接続すると、DirectShowで認識されるRGB24または一部のRawメディア形式が出力されます。同様に、オーディオの場合、PCMと出力することもできます。

編集: 私は同じアプローチ(CSource、CSourceStream)を使用しました。つまり、DoBufferProcessingLoopはFillBufferを呼び出します。私の一般的なアプローチは、生産者 - 消費者のパターンを使用することでした。ネットワーキング読み取りスレッドは、キューをサンプルで実装し、オーバーライドされたDoBufferProcessingLoopでは、キューにデータがあるかどうかをチェックし、データがある場合はFillBufferを呼び出します。もちろん、イベント(フレーム可用性)を待つなどの他の方法を試すことができます。私が使用した手法を見るには、http://sourceforge.net/projects/videoprocessing/にサンプルRTSPソースフィルタのソースコードをダウンロードしてください。私が言いたいことは、ちょっと試してみるだけです。

+0

私の質問は、受信したH 264でエンコードされたバイト配列を待つアプリケーションの2番目のスレッドに関するものでした。受信したバイト配列をデコードルーチンを使ってYV12/I420とデコードします。このデコーダは、そのようなフィルタではありません。私が計画しているのは、デコードバイト配列がソースフィルタに与えられることです(PushSourceのように、あなたが提案したように作成されます)。このアイデアを検証してください。 –

+0

あなたはもちろんそのようにすることができます。私のコメントは、ソフトウェアのコンポーネント化/モジュール化に役立つ他のアプローチを強調することを意図していました。 E.Gでは複数のシナリオ/アプリケーションでH.264エンコーダ/デコーダを使用し、「ネットワークから受信」と「デコード」という2つの動作を別々のフィルタで実行することで、フィルタを再利用できます。しかし、最終的にはあなたのために働くものは何であるかです。メディアタイプが正しく設定されていれば、グラフをレンダリングすることができます。 – Ralf

+0

こんにちは、 ヒントありがとうございます。私は一度サンプルを通過した後、いくつか質問があります。 これはDLLです。 GraphEdtまたはDirectShowアプリケーションプログラミングコンテキストから使用できるように、これをどのように登録しますか? これの使用例は大歓迎です。 ありがとうございます。 Shiju –

関連する問題