DM>Нужно построить цепочку DM>source file -> AVI Splitter -> Decoder -> Sample Grabber -> Null Renderer
DM>OneShot не надо true, включаем в граббере буферизацию сэмплов, переводим граф в состояние паузы, делаем seek на нужную позицию, берем сохраненный в граббере кадр.
DM>Вручную все добавлять необязательно. Можно добавить File Source Async, сказать ему открыть нужный файл, затем добавить сэмпл граббер и сказать ему в каком формате принимать данные (например, RGB24 или RGB32 или YV12), затем через RenderStream соединяем эти два фильтра, промежуточные добавятся сами.
-------------------------------
Спасибо за совет, попытался его реализовать, но пока безуспешно.
Во первых, пишет: RenderStream is not a member of IGraphBuilder. Что то здесь я не понял.
Ну ладно, вручную соединил выход pSourceFile и вход pGrabberF.
Странно то, что если код из функции ConnectFilters(pSourceFile, pGrabberF, &pPinOut);
вставить в функцию, он не работает (в коде закомментировано). При закрытии программы пишет ошибку обращения к памяти, хотя сама функция почти со всем тем же работает…
Теперь у меня стопорится на
hr = pGrabber->GetCurrentBuffer(&lBufSize,(long*)pDIB); Выдает пустой (белый) кадр, хотя lBufSize при инициализации примерно похоже на кадр (типа 1456886).
hr = pBasicVideo->GetCurrentImage(&lBufSize,NULL); которое раньше работало уже при попытке запроса возвращает ошибку.
Народ, извините меня, но очень хочется собрать рабочий шаблон подобной задачи (кадровый доступ). Уже столько времени угроблено, что жалко бросать нерешенную проблему. Может я чего то не понимаю, подскажите пожалуйста, какой и куда код надо вставить, что бы это заработало. Может есть другой способ перескакивать между кадрами, и зря я уцепился в эти pMediaSeeking и pBasicVideo?
------------------------------- DM> делаем seek
это как? pMediaSeeking->SetPositions(...)?
DM> включаем в граббере буферизацию сэмплов
это как? OneShot(false)?
DM>берем сохраненный в граббере кадр.
так: pGrabber->GetCurrentBuffer(...)?