2017-02-03 6 views
2

私は、MediaFoundation SourceReader技術を使用してUSBカメラストリーミングデスクトップアプリケーションを開発しています。カメラはUSB3.0をサポートしており、1080p MJPGビデオフォーマット解像度で60fpsを提供します。MediaFoundationのインテルハードウェアMJPEGデコーダMFTを使用する方法Windowデスクトップアプリケーション用のSourceReader?

ソフトウェアMJPEGデコーダMFTを使ってMJPGをYUY2フレームに変換し、次にRGB32フレームに変換してウィンドウに描画しました。 60fpsの代わりに、私はこのソフトウェアデコーダを使用するときにウィンドウに30fpsしかレンダリングできません。私はこのサイトに質問を投稿し、インテルハードウェアMJPEGデコーダMFTを使用してフレームドロップの問題を解決する提案を得ました。 IMFTransform :: ProcessInputの()メソッドを呼び出すときをMF_E_NOTACCEPTING -

私はエラー0xC00D36B5に直面しています。このエラーを解決するために、MSDNはIMFTranformインターフェイスを非同期的に使用することを提案しました。そこで、私はIMFMediaEventGeneratorすべてのIn/OutサンプルのGetEventへのインタフェースを使用しました。正常に、私は1つの入力サンプルだけを処理でき、次にIMFMediaEventGenerator :: GetEvent()メソッドはを返します。MF_E_NO_EVENTS_AVAILABLEエラー(GetEvent()は同期)です。

私は非同期SourceReaderのコールバックだけでなく、IMFTransformを設定しようとしたが、MFAsyncCallback ::呼び出し方法は、私がGetEventメソッドを使用することを計画し、したがって、起動されていません。

私には何かがありませんか?はい、誰かが私のプロジェクトにIntel Hardware Decoderを使用するように案内しますか?

+0

topoeditでトポロジを最初にアセンブルしようとしましたか? – Mgetz

+0

あなたの返信ありがとう、Mgetz.Theカメラは、YUY2とMJPGビデオフォーマットの両方をサポートしています。最初は、カメラはYUY2ビデオ形式を再生し、MJPG形式を変更する必要があります。私はDirectShowでグラフを構築する方法を知っています。私はYUY2からMJPEGビデオ形式に切り替える方法を知らなかった。MJPG形式のトポロジを組み立てる方法を教えてください。さらに、MediaSessionトポロジにこのデコーダを追加し、すべてが成功し、イベントで0XC00D5212(MF_E_TOPO_CODEC_NOT_FOUND)を受信しました。 – Abi

+0

したがって、SDKに同梱されているtopoeditユーティリティを使用してトポロジをアセンブルし、動作することをテストすることをお勧めします。 topoeditでトポロジを構築できない場合はおそらく不可能です。 – Mgetz

答えて

1

インテルハードウェアMJPEGデコーダMFTはasynchronous MFTです。直接管理する場合は、非同期モデルを適用する必要があります。あなたはこれをやっているようですが、問題を解決するための情報は提供していません。はい、上記の記事のProcessInput,ProcessOutputセクションに記載されているイベントモデルを使用することになっています。最初のフレームを取得すると、よりスムーズな連続処理で動作するようにさらにデバッグする必要があります。

私たちのソースリーダーのようなAPIを使用する場合、MFTを扱うMedia Foundation自体があります。適切なときに同期および非同期消費を行うことができます。しかし、この場合はIMFTransformの呼び出しをしないでください。あなたのあいまいな説明からも、それは間違ったやり方です。

+0

私の誤り、ローマを訂正していただきありがとうございます。私は非同期コールバックを登録し、非同期イベントを取得しようとしましたが、IMFAsyncCallback :: Invoke()からイベントを取得しませんでした。 SourceReaderの非同期コールバックを登録し、ハードウェアMFTにアクセスする方法を教えてください。 – Abi

+0

MFTに対してIMFAsyncCallbackコールバックを正常に登録しました。入力サンプルを2回処理するためにMFTransformNeedInputイベントを受信しましたが、MFTransformHaveOutputイベントはすべて呼び出されません。私は自分のプロジェクトでこのコードを使用しています。 https://www.dropbox.com/s/t6figfl9b2kyp6y/HwMJPEGDecoderMFT_Code_Query.txt?dl=0のコードを確認するには、DropboxのリンクをPFAにしてください。私は自分のコードでProcessOutputSample()メソッドをコメントし、継続的に受信するMFTransformNeedInputイベントタイプをチェックしました。何が間違っているのか、私はなぜProcessOutputSampleを受け取っていないのか教えてください。 – Abi

+0

@Abika:ちょうどコードスニペットですが、私はそこでしばらくは好きではありませんが、もっと重要なのは実行可能ではないということです。クリティカルセクションで保護されたコードフラグメントからWaitForSingleObjectを順番に実行する方法が間違いです。 –

関連する問題