LINUX.ORG.RU

[ffmpeg] перемотка по кадрам в обе стороны


0

1

Собственно, задача - сабж. Есть видео в 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 смотрел, он с моим видео просто не работает.

★★★★★

Думаешь правильно. С типами фреймов, вероятно, будешь бороться в каждом контейнере.

mv ★★★★★ ()

Меня тоже интересует этот вопрос. Хотя на DTS/PTS у меня работает ( по крайне мере, на некоторых видео файлах - точно ;) )

AoD314 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.