FFMPEG извлекает внутрикадровые кадры I, P, B

4

Есть ли способ извлечь внутренние кадры и сохранить их как есть из FFMPEG или аналогичной программы? Я знаю, что вы можете извлечь кадры в последовательность изображений JPEG, используя -f image2. Но это полные изображения каждого из кадров. Я хотел бы экспортировать только изображение изменения движения, поэтому у меня были бы кадры P и B, показывающие только изменение движения, исключая или маскируя неизмененную область изображений.

Это возможно?

Я использую базовую команду экспорта фрейма. Это дает мне полные кадрированные изображения каждого кадра с указанным FPS.

ffmpeg -i input.mp4 -r 12 -an -b 1024k -y -f image2 frame%4d.jpg

Я надеюсь экспортировать кадры, чтобы у меня была папка с кадрами, где первый кадр был бы полным изображением, а следующий кадр - это только те данные изображения, для которых необходимо перерисовать изображение. Выявление временной избыточности между двумя кадрами (разве это не то, что делают кадры I, P, B?)

ndmweb
источник

Ответы:

5

Чтобы извлечь кадр типа certin, используйте фильтр выбора:

select=eq(pict_type\,<x>)

где <x>один из следующих:pict_type (video only) the type of the filtered frame, can assume one of the following values: I, P, B, S, SI, SP, BI

Так, например:

ffmpeg -i <inputfile> -vf '[in]select=eq(pict_type\,B)[out]' b.frames.mp4

Чтобы понять больше о выводе, добавьте showinfoфильтр:

ffmpeg -i <inputfile> -vf '[in]select=eq(pict_type\,B),showinfo[out]' b.frames.mp4

НАПРИМЕР
источник
1
[in]И [out]не требуется в первом примере.
Slhck
Хороший ответ, но я рекомендую предоставить ссылки на официальную документацию для каждого упомянутого фильтра: selectи showinfo.
llogan
хотя это работает, я надеялся на решение, которое экспортировало бы все типы фреймов, но сохраняло бы фреймы такими, какие они есть (некоторые представляют собой только область изображения, которую необходимо перерисовать, а некоторые - полную перерисовку)
ndmweb
1
@ndmweb Вы не можете экспортировать не внутри фрейма "как есть". Нет достоверной информации об изображении - попросту говоря, макроблок / кадр P или B сохраняет только различия между следующим изображением. Я боюсь, что для того, чтобы делать то, что вы хотите, вам нужно изучить кодирование с помощью MATLAB или аналогичных инструментов. По крайней мере, я не знаю ни о каком существующем решении.
Slhck
4

Кадры P и B обычно не содержат новые данные изображения для каждой из областей, которые изменились. Скорее картина разбита на макроблоки разных типов. Некоторые типы макроблоков содержат новые данные изображения, но большинство вычисляют содержимое на основе других опорных изображений и векторов движения.

Не совсем то, что вы просили, но это будет использовать цвет, чтобы показать вам тип каждого макроблока:

ffmpeg -debug vis_mb_type -i input.mp4 output.mp4

или же

ffplay -debug vis_mb_type input.mp4

Это также покажет вам векторы движения:

ffplay -debug vis_mb_type -vismv 7 input.mp4

Обратитесь к ссылке для получения дополнительной информации о цветах каждого МБ:

Документация по отладке макроблоков и векторов движения FFMpeg

mark4o
источник
Хорошая информация, чтобы иметь, хотя бы для того, чтобы понять, что весь кадр должен состоять не только из внутрикодированных макроблоков.
Slhck