Собственно, задача - сабж. Есть видео в h264 (потенциально в чем угодно), нужно уметь мотать его по одному кадру в обе стороны, а также перескакивать точно на нужный номер кадра. Как я понял, в общем случае это невозможно, но для начала возьмем частный, когда есть индекс. av_seek_frame может seek'ать до кейфреймов, от которых можно домотать вперед до нужного кадра, и тут два вопроса.
Во-первых, как узнать номер кадра после перемотки до кейфрейма? DTS/PTS ненадежны - у меня есть видео где PTS нет, а DTS начинается с 2. Разве что сразу после открытия файла читать первый кадр и сохранять его DTS.
Во-вторых, кейфреймы могут располагаться достаточно редко (у меня раз в 60 кадров), т.е. получается что при сике на 1 фрейм назад с кейфрейма придется делать av_seek_frame до предедущего, декодить 60 фреймов и, видимо, ещё и сохранять их в памяти, чтобы не декодить 59 штук при следующем сике. Есть какой-то более эффективный способ?
Есть один нюанс - видео у меня в любом случае предобрабатывается с последовательным чтением кадров, поэтому есть вариант построить свой индекс с произвольной частотой кейфреймов и нумерацией кадров, с привязкой к смещению пакетов в видео файле. Как это лучше сделать? Получится ли просто считать кейфреймами все I-фреймы и просто мотать до них av_seek_frame'ом по смещению, или всё сложнее (что-то говорит мне что нужно два I-фрейма чтобы работали B-фреймы)?
PS. ffmpeg_fas смотрел, он с моим видео просто не работает.