1

ビデオ ファイルから画像データを取得する効果的な方法を探しています。FilgraphManagerClass.GetCurrentImage()現在、Interop.QuartzTypeLibライブラリからテストしています。これは私が必要とすることを行いますが、非常に遅いです。各ビデオのすべてのフレームを処理する必要があります。より良いオプションはありますか?

要件

  • フレーム精度である必要があります。<-- とても重要!
  • デコードされたピクセル バッファ (intまたはの配列byte[])、理想的には RGB24 または RGB32 にアクセスできます。
  • バッファは、リアルタイムまたはより高速に取得できます。ビデオを表示する必要はありません。ピクセルを分析するだけで済みます。
  • mp4 ファイル (h264/aac) を処理します。必要に応じて、AviSynth 経由でリラップまたはフレーム サーブを実行できますが、再トランスコーディングは必要ありません。

どんな提案でも大歓迎です。

要求されたいくつかのコード:

FilgraphManagerClass graphClass = new FilgraphManagerClass();
graphClass.RenderFile(@"C:\tmp\tmp.avs");

int sz = (graphClass.Width * graphClass.Height + 10) * 4;    
int[] buffer = new int[sz - 1];

次に、各フレームをステップ実行します。ループに次のようなものがあります。

graphClass.GetCurrentImage(ref sz, out buffer[0]);
//DoStuff(buffer);
graphClass.CurrentPosition += graphClass.AvgTimePerFrame;
4

2 に答える 2

5

IBasicVideo::GetCurrentImage使用している方法は、基本的にスナップショットを対象としており、レガシー モードでのレガシー ビデオ レンダリングでのみ機能します。つまり、(a) 時間的に正確ではなく、フレームを複製したり、逆にフレームを失ったりする可能性があります。(b) ビデオを表示することを前提としています。

代わりに、次の種類のフィルタ グラフを作成します: File Source -> ... -> Sample Grabber Filter -> Null Renderer。標準コンポーネントである Sample Grabber にはコールバックを提供できるため、それを介して受信したフレーム データを呼び出すことができます。

SetReferenceClock(null)次に、(リアルタイムではなく) 可能な限り高速に実行されるように、フィルター グラフを呼び出してグラフからクロックを削除します。次にRun、グラフとすべてのビデオ フレームがコールバックに提供されます。

C# でタスクを実行するには、 DirectShow.NET ライブラリを使用する必要があります。このCapture\DxSnapサンプルは、Sample Grabber の使用方法の簡単な例を提供します。彼らはBufferCB代わりにそれをやり遂げSampleCB、それもうまくいきます。他のサンプルもこのアプローチを使用しています。

このタスクに非常に近い他のコード スニペットを見つけることができます。

ファイルに関してMP4は、次の点を考慮する必要があります。

  1. MPEG-4 のサポートは Windows では制限されており、ファイルを再生可能にするには、サード パーティのコンポーネントをインストールする必要がある場合があります。GraphEdit がそれらを読み取ることができれば、あなたも読み取ることができます。
  2. Windows Media Player は新しい API を使用している可能性があり、その可能性が高いため、むしろ GraphEdit を確認する必要があります。
  3. MP4 のサポートは、インストールされている 32 ビット コンポーネント/ライブラリにのみ存在しますが、アプリが 64 ビット ドメインで実行されているというシナリオに陥らないように、必ずアプリケーションでWin32/ platform を使用してください。x86
于 2012-07-21T18:04:10.610 に答える
0

Windows Media Foundationを使用して allocator-presenter を作成することも検討できます。これにより、デコードされたビデオ フレームが GPU テクスチャとして提供され、CUDA または OpenCL を使用して必要な処理を実行することもでき (可能であれば)、処理速度が大幅に向上します。

于 2012-07-21T19:04:08.703 に答える