2016-09-29 7 views
1

何らかの理由で私はH.264をデコードできません。 入力/出力の設定は、入力/出力バッファの作成と同様にうまくいっています。Media Foundation H.264デコーダを動作させるには?

ライブストリームからデマルチプレクスされたH.264を手動でデコーダに供給しています。したがって、メディアサブタイプとしてMFVideoFormat_H264_ESを使用します。デコードは非常に遅く、デコードされたフレームは完全なゴミです。他のデコーダは、同じストリームを適切にデコードしています。

奇妙なことは、いったんProcessInput()がMF_E_NOTACCEPTINGを返すと、次のProcessOutput()はMF_E_TRANSFORM_NEED_MORE_INPUTを返します。 MSDNによると、これは決して起こらないはずです。

誰でもどのようにして具体的な情報を提供できますか? (私が真剣に疑うMF H.264が機能していると仮定して)。

私は余分な情報を提供したいと考えていますが、誰かが手助けするために必要と思われるものがわかりません。

編集: 入力バッファのバイト数を正確にゼロにリセットする必要がありますか。Btw、私はProcessOutput()が何かを(ガベージ)提供するときに出力バッファをリセットします。

Edit2: 入力バッファの現在のバッファサイズを0にリセットせずに、半有効な出力を得ることができました。準有効とは、すべての成功したProcessOutput()で、現在の画像に前のフレームよりもいくつかのデコードされたマクロブロックが含まれているYUV画像を受け取ることを意味します。残りのフレームは黒です。私はサイズをリセットしないので、これはしばらくしてから停止します。だから、私はバッファサイズをリセットすることに問題があると思うし、フレーム全体が完了した(またはしない)ときに私はいくつかの通知を取得する必要がありますね。

Edit3: 入力バッファを作成するとき、GetInputStreamInfo()は入力バッファサイズとして4096を返します。しかし、4kでは不十分です。 4MBに増やすと、フレームフラグメントごとにフレームを解凍するのに役立ちます。フレーム全体がいつデコードされたかを知る方法があるかどうかを判断する必要があります。

+0

デコーダのSetInputTypeとSetOutputTypeをどのように呼び出しますか? ProcessInputの最初の呼び出しの前にMFT_MESSAGE_NOTIFY_BEGIN_STREAMINGとMFT_MESSAGE_NOTIFY_START_OF_STREAMメッセージを送信しましたか? – VuVirt

+0

入力バッファも出力バッファもリセットしないでください。 MSDNからの引用:「呼び出し元がメディアサンプルを割り当てる場合、メディアサンプルには出力データを保持するのに十分なバッファが必要です。バッファに既に存在するすべてのデータを上書きします。 " https://msdn.microsoft.com/en-us/library/windows/desktop/ms704014(v=vs.85).aspx – VuVirt

+0

はい、両方のメッセージが正常に送信されました.MFT_MESSAGE_NOTIFY_BEGIN_STREAMINGとMFT_MESSAGE_NOTIFY_START_OF_STREAM。 SetInputTypeとSetOutputTypeはうまくいった。デコード中にMF_E_TRANSFORM_STREAM_CHANGEを受信し、正常に処理しました。バッファの上書きに関しては、MSDNの記述どおりには機能しません。いくつかのデコーダでは、ProcessOutput()が何かを渡すと、バッファの長さを0にリセットしなければなりませんでした。 – kytodrk

答えて

1

入力バッファを作成するとき、GetInputStreamInfo()は4096をバッファサイズとして返しますが、これは小さすぎます。 入力バッファを4MBに設定すると問題が解決しました。バッファーはおそらくもっと小さいかもしれません...まだそれをテストしなければなりません。

+1

しかし、MFは他のデコーダと同じフレームではなくガーベッジを生成します。結局のところ、それはかなり役に立たない。 – kytodrk

関連する問題