小さなビデオ ファイルを開き、メモリ内のすべてのフレームをマップしたいと思います (カスタム フィルターを適用するため)。私はビデオ コーデックを処理したくありません。むしろ、ライブラリに処理させたいと思います。
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 リンクが機能しないようです (バグを参照)