26

小さなビデオ ファイルを開き、メモリ内のすべてのフレームをマップしたいと思います (カスタム フィルターを適用するため)。私はビデオ コーデックを処理したくありません。むしろ、ライブラリに処理させたいと思います。

SampleGrabber フィルターで Direct Show を使用しようとしました (このサンプルhttp://msdn.microsoft.com/en-us/library/ms787867(VS.85).aspxを使用) を使用しましたが、いくつかのフレームしか取得できませんでした(すべてのフレームではありません!)。私はビデオ ソフトウェア プログラミングの初心者です。最適なライブラリを使用していないか、間違っている可能性があります。

コードの一部 (主に msdn の例からの変更されたコピー/貼り付け) を貼り付けましたが、残念ながら、期待どおりに最初の 25 フレームを取得できません...

[...]

hr = pGrabber->SetOneShot(TRUE);
hr = pGrabber->SetBufferSamples(TRUE);

pControl->Run(); // Run the graph.
pEvent->WaitForCompletion(INFINITE, &evCode); // Wait till it's done.

// Find the required buffer size.
long cbBuffer = 0;
hr = pGrabber->GetCurrentBuffer(&cbBuffer, NULL);

for( int i = 0 ; i < 25 ; ++i )
{
    pControl->Run(); // Run the graph.
    pEvent->WaitForCompletion(INFINITE, &evCode); // Wait till it's done.

    char *pBuffer = new char[cbBuffer];
    hr = pGrabber->GetCurrentBuffer(&cbBuffer, (long*)pBuffer);

    AM_MEDIA_TYPE mt;
    hr = pGrabber->GetConnectedMediaType(&mt);
    VIDEOINFOHEADER *pVih;
    pVih = (VIDEOINFOHEADER*)mt.pbFormat;

    [...]
}

[...]

ビデオ ソフトウェアの経験があり、コードやその他のより単純なライブラリについてアドバイスできる人はいますか?

ありがとう

編集: msdn リンクが機能しないようです (バグを参照)

4

7 に答える 7

29

現在、Win32 プラットフォームで利用できる最も一般的なビデオ フレームワークは次のとおりです。

  1. Windows 用のビデオ: Win95 の時代に登場した古い Windows フレームワークですが、非常に使いやすいため、今でも広く使用されています。残念ながら、適切な VFW コーデックがインストールされている AVI ファイルのみをサポートしています。

  2. DirectShow: 標準の WinXP フレームワーク。基本的に、Windows Media Player で再生できるすべてのフォーマットをロードできます。むしろ使いにくい。

  3. Ffmpeg : より正確には、Ffmpeg オープンソース マルチメディア ユーティリティに付属する libavcodec および libavformat です。これは非常に強力で、システムにコーデックがインストールされていなくても、多くの形式 ( VLCで再生できるほとんどすべて) を読み取ることができます。使い方はかなり複雑ですが、同梱されている ffplay のコードや、オープンソース ソフトウェアの他の実装からいつでもインスピレーションを得ることができます。とにかく、DS よりずっと使いやすい (そしてずっと速い) と思います。これは Windows 上の MinGW でコンパイルする必要がありますが、すべての手順はここで非常によく説明されています(現時点ではリンクがダウンしています。死んでいないことを願っています)。

  4. QuickTime : Apple フレームワークは、Windows プラットフォームに最適なソリューションではありません。QuickTime アプリをインストールする必要があり、すべてのフォーマットに適切な QuickTime コーデックも必要だからです。多くの形式をサポートしているわけではありませんが、プロの分野では非常に一般的です (そのため、一部のコーデックは実際には QuickTime 専用です)。実装が難しすぎるべきではありません。

  5. Gstreamer : 最新のオープン ソース フレームワーク。私はそれについてあまり知りませんが、他のシステムのいくつかをラップしていると思います (しかし、よくわかりません)。

このフレームワークはすべて、DirectShow を除き、OpenCv Highgui のバックエンドとして実装されています。Win32 OpenCV のデフォルト フレームワークは VFW を使用しています (そのため、一部の AVI ファイルしか開くことができません)。他のものを使用したい場合は、公式リリースの代わりに CVS をダウンロードする必要があります。たとえば、FFMPEG バックエンドがストリーム内でのシークを許可していません。OpenCV で QuickTime を使用する場合は、これが役に立ちます。

于 2008-09-01T14:53:38.503 に答える
2

OpenCVを使用して、ビデオ ファイルを読み込んで処理しました。また、コンピューター ビジョンに役立つものを含む、多くの種類のビデオ処理にも便利です。

于 2008-09-01T13:59:40.630 に答える
2

SampleGrabber の「Callback」モデルを使用すると、より良い結果が得られる場合があります。Samples\C++\DirectShow\Editing\GrabBitmaps の例を参照してください。

Samples\C++\DirectShow\Filters\Grabber2\grabber_text.txt および readme.txt にも多くの情報があります。

于 2008-09-01T15:16:09.807 に答える
1

AVI ファイルの場合は、AVI ファイルから自分でデータを読み取り、フレームを抽出します。次に、ビデオ圧縮マネージャーを使用して解凍します。

AVI ファイル形式は非常に単純です。http: //msdn.microsoft.com/en-us/library/dd318187 (VS.85).aspx (および google を使用) を参照してください。

ファイルを開いたら、各フレームを抽出し、それを ICDecompress() に渡して解凍します。

大変な作業のように思えますが、これが最も信頼できる方法です。

それが面倒な場合、または AVI ファイル以外のファイルが必要な場合は、ffmpeg を使用してください。

于 2009-05-16T18:13:57.410 に答える
1

あなたの場合のビデオが一連の画像につながるだけでよい場合は、OpenCV が最適なソリューションです。実際のビデオ処理を行う場合は、ViDeo が「ビジュアル オーディオ」に相当するため、「martjno」が提供するものを追跡する必要があります。Win7 用の新しい Windows ソリューションには、さらに 3 つの新しい可能性が含まれています。

  1. Windows Media Foundation: DirectShow の後継。クリーンアップされたインターフェース
  2. Windows Media Encoder 9: プログラムが含まれているだけでなく、コーディング用のライブラリも同梱されています。
  3. Windows 式 4: 2 の後継。

最後の 2 つは商用のみのソリューションですが、最初の 1 つは無料です。WMF をコーディングするには、Windows SDK をインストールする必要があります。

于 2010-09-20T20:21:47.077 に答える
1

OpenCVライブラリを使用してみてください。必要な機能を確実に備えています。

このガイドには、ビデオ ファイルからのフレームへのアクセスに関するセクションがあります。

于 2008-09-01T14:01:03.200 に答える