Достать все кадры видео для обработки DirectShow

Здравствуйте.
Есть такая программа Vegas да и сотни разных программ по редактированию видео. При загрузке видео программа достаточно быстро разбирает видео на потоки и представляет в виде последовательности кадров.

Как она это делает?? Можно ли что то подобное сделать с помощью DirectShow чтобы использовать всю мощь готовых кодеков?? Но в случае sampleGrabber проигрыватель показывает видео в стандартном времени. А если нужно обработать фильм на час то ждать часа очень нехорошо.

Видеоредакторы же наверняка используют стандартные кодеки для разбора потоков?? Не думаю что каждая прога пишет какие то свои обработчики для всех форматов??

Это как? В таймлайне внизу вроде во всех редакторах обычно никаких кадров нет, только какая-нибудь превью-иконка файла/куска как в файловых менеджерах.

Ну и если и показывать какие-то кадры, то надо ж не все доставать, а только например через каждые несколько секунд.

Еще для ускорения работы они часто генерируют прокси-файлы низкого качества.

https://www.google.com/search?q=adobe+premiere+proxy
https://www.google.com/search?q=kdenlive+proxy+clips

Вообще если надо поискать как что-то делают видео-редакторы, то например вот опенсорс
Multimedia / Kdenlive · GitLab

Ну это же по сути перекодирование. Оно же тоже долго будет выполняться.

Да и у меня задача при обработке нужно проанализировать все кадры и вытащить с них особую информацию через opencv. Поэтому надо просмотреть каждый кадр в хорошем качестве. Сейчас используется open264 библиотека. Но она это все делает очень уж долго.

В DirectX можно задать скорость проигрывания выставив на максимум.
Либо как предложила ранее перемещаться между кадрами там есть позиционирование либо прокрутка к опорным кадром.
Проблема видео в том что оно может не содержать опорных кадров

Можете изучить исходники VirtualDub
http://sourceforge.net/projects/virtualdub/files/virtualdub-win/1.10.4.35491/VirtualDub-1.10.4-src.7z/download

Богатые фирмы как Пинекл и Vegas вроде пишут свои парсеры.

А Open264 у вас тормозит скорее всего потому что скомпилировано без AVX и SSE.
Просто перекомпилировать.

А вообще все используют Free Fast Mpeg сокращенно FFMpeg.
Он уже года 3 как умеет по кадрово перемещаться. До этого по времени было. Но он быстро извлекает.

Ну вот я уже и пришел к этой мысли … написал вот ридер файлов …

Kdenlive за несколько минут создал прокси видео 50мин 3 ГБ.

Он вроде бы вызывает ffmpeg: src/jobs/proxytask.cpp · master · Multimedia / Kdenlive · GitLab

В ffmpeg главное параметры правильные найти, тут пишут, что по умолчанию он использует какой-то медленный точный способ перемещения.

Так я не через командную строку работаю. Сделал библиотеку которая вроде как напрямую использует все функции.

Прокси видео мне не подойдут. Все равно для обработки нужны нормальные кадры полноценные. Вообще у меня была идея быстро достать все кадры в память пусть это даже займет пару гигов оперативы, а затем с помощью паралельных вычислений запустить на всех кадрах распознавание.

А по перемещению тут есть какой то код…

int64_t FrameToPts(AVStream* pavStream, int frame) const
{
	return (int64_t(frame) * pavStream->r_frame_rate.den * pavStream->time_base.den) (int64_t(pavStream->r_frame_rate.num) * pavStream->time_base.num);
}

iSeekTarget = FrameToPts(m_pAVVideoStream, max(0, lFrame));
	iSuccess = av_seek_frame(m_pAVFmtCtx, m_iVideo_Stream_idx, iSeekTarget, iSeekFlag);

	AVPacket avPacket;
	iRet = av_read_frame(m_pAVFmtCtx, &avPacket);

Но в любом случае это наверное будет эффективнее чем что у меня реализовано на h264lib когда я предварительно формирую таблицу опорных кадров… потом при перелистывании ищу ближайший опорный кадр и от него начинаю декодировать пока не дойду до нужного кадра …