H.264 stream
SDKを使用してDVRからを受信しています。メモリリークがあり、すべてのリークの原因はSDKだと思いました。しかし、ストリームを記録し、ディスクから1つずつフレームを読み取って再生すると(サードパーティのdllが関与していない場合)、問題はdllではなくストリーム自体にあることに気付きました。
奇妙なことにDivX H264 Decoder
、メモリリークを引き起こさない唯一のコーデックですが、ストリームが長時間実行されると、DivXデコーダーもクラッシュすることがあります。使用したいMicrosoft DTV-DVD Video Decoder
のですが、大量のメモリリークが発生し、多くのフレームがドロップされます。私が試した他の多くのH.264デコーダーも同じように動作します。
h.264 frames
他の問題のないストリームと比較していくつかを使用して調べましたh.264 parsers
が、ログから明らかなことは何もわかりませんでした。
私の問題はh.264フレーム構造に関するものなので、FramesFromFileSourceFilter
以下からダウンロードできるという名前のソースフィルターを用意しました。
http://www.akaydin.com/directshow/FramesFromFileSourceFilter.zip
これはVisual Studio 2008
プロジェクトであり、すべての依存関係は、比較的配置されたフォルダー(h.264フレームを含む)のzipファイルに含まれています。したがって、必要なのは、プロジェクトをコンパイルし、出力をに登録し、regsvr32.exe
GraphEditまたはGraphStudioから必要なh.264デコーダーでフィルターを実行することだけです。グラフの例を以下に示します。
また、h264フレームは、以下のリンクで単一の生のh264ファイルとして利用できます。これはVLCで再生できます(元のFPSは12 FPSであったため、FPSが間違っています)。
http://www.akaydin.com/directshow/stream.zip
質問:
DivXデコーダーを除く多くの有名なH264デコーダーでメモリリークの問題を引き起こしている可能性があります。このストリームの何が問題になっていますか?
アップデート1
データスレッドの読み取りは削除され、機能はバッファとフラグを使用せずにFillBufferに移動されます。問題は同じままです。
http://www.akaydin.com/directshow/FramesFromFileSourceFilterUpdate1.zip
アップデート2
Update1は、いくつかの問題を引き起こしていた関数で使用Sleep()
していました。FillBuffer()
今、私はを削除しSleep()
、以前SetTime()
は〜12FPSでした。これによりMicrosoft DTV-DVD Video Decoder
、フレームのドロップの問題も解決されましたが、メモリの問題は解決されませんでした。
http://www.akaydin.com/directshow/FramesFromFileSourceFilterUpdate2.zip
メモリの増加はでWorking Set
のみ発生します。Virtual Bytes
安定してPrivate Bytes
いるようです。でのみ発生する継続的なWorking Set
メモリ増分の原因は何でしょうMicrosoft DTV-DVD Video Decoder
か?