Я хотел бы открыть небольшой видеофайл и отобразить каждый кадр в памяти (для применения специального фильтра). Я не хочу обрабатывать видеокодек, я бы предпочел, чтобы библиотека обрабатывала это для меня.
Я попытался использовать Direct Show с фильтром SampleGrabber (используя этот образец 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 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 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, похоже, не работают (см. Ошибку)