Формат MPEG-4 не является внутренне кодированным форматом, поэтому вы не можете просто перейти к произвольному кадру и декодировать его самостоятельно, так как большинство кадров кодируют только отличия от одного или нескольких других кадров.Я подозреваю, что ваше декодирование идет медленно, потому что, когда вы попадаете на кадр, для которого несколько других зависимых кадров должны быть декодированы первыми.
Один из способов повысить производительность - это определить, какие кадры являются ключевыми кадрами (или иногда их также называют «синхронизировать»'точки) и ограничьте ваше декодирование этими кадрами, поскольку они могут быть декодированы самостоятельно.
Я не очень знаком с возможностями DirectShow, но я ожидаю, что у него есть некоторый API для отображения точек синхронизации.
Кроме того, я должен отметить, что QuickTime SDK для Windows, возможно, является еще одним хорошим вариантом для декодирования кадров из фильмов.Сначала вы должны проверить, что ваши фильмы AVI воспроизводятся правильно в QuickTime Player.А QT SDK действительно предоставляет точки синхронизации, см. Раздел Поиск интересных моментов в документации QT SDK.