生の非圧縮バイト ストリーム (ピクセルあたり 2 バイト、2^18 ピクセル/フレーム、32 フレーム/秒) としてメモリ内のリング バッファーを介してプッシュされるライブ 16 ビット グレースケール ビデオ ストリームがあります。(これは、PCI フレームグラバーを介して、科学グレードのカメラから来ています)。ビデオで簡単な処理 (ダイナミック レンジのクリップ、色付け、オーバーレイの追加) を行い、C# を使用してウィンドウに表示したいと思います。
これは、Windows フォームと GDI を使用して動作しています (フレームごとに Bitmap オブジェクトを作成し、後処理手順に基づいて生の 32 ビット RGB ピクセル値を書き込み、Graphics クラスを使用してフレームを描画します)。しかし、これは私が他のことに使用したい CPU のかなりの部分を使用します。そのため、GPU で高速化されたビデオ表示に WPF を使用することに興味があります。(データ バインディングとレイアウト機能のために WPF の使用も開始したいと思います。)
しかし、これまで WPF を使用したことがないため、これにアプローチする方法がわかりません。ビデオと WPF についてオンラインで見つけたもののほとんどは、圧縮されたビデオ ファイルをディスク (WMV など) から読み取るか、Windows が既に認識しているドライバー レイヤーを使用してコンシューマー グレードのカメラからストリームを取得することに関するものです。したがって、ここでは適用されないようです (ただし、これについて間違っている場合は修正してください)。
だから、私の質問:
メモリ内の生の圧縮されていないバイトからビデオを再生するための簡単な WPF ベースの方法はありますか (8 ビット グレースケールまたは 24 ビット RGB であっても)。
GPU で後処理を行うには、DirectShow フィルター (またはその他の DirectShow/Media Foundation っぽいもの) を作成する必要がありますか?
また、これらのタスクに適したドキュメント、例、ブログなどに関する一般的なアドバイスや提案をいただければ幸いです。ありがとう!
フォローアップ:いくつかの実験の後、私WriteableBitmap
は自分のニーズに対して十分に高速であり、正しく使用するのが非常に簡単であることがわかりました.単に呼び出すだけでWritePixels()
、それにImage
バインドされたコントロールは自動的に更新されます. InteropBitmap
メモリ マップト セクションを使用すると著しく高速になりますが、.NET 3.5 で使用するには、p/invokes を kernel32.dll に書き込む必要がありました。