Использование ffprobe/ffmpeg для извлечения отдельных кадров и типов в порядке кодирования

Я могу извлечь ключевые кадры с помощью ffmpeg. Нечто подобное, которое я использовал:

ffmpeg -i input.mp4 -vf "select='eq(pict_type\,I)" -vsync vfr -qscale:v 2 I-thumbnails-%02d.png -vf "select='eq(pict_type\,B)" -vsync vfr -qscale:v 2 B-thumbnails-%02d.png -vf "select='eq(pict_type\,P)" -vsync vfr -qscale:v 2 P-thumbnails-%02d.png

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

IBBBIPPB...... BI

но таким образом, что я могу сортировать кадры в последовательности кодирования.

Я хочу использовать это для загрузки в python для извлечения векторов движения, но все они должны следовать последовательности кодирования. Любая помощь?

Редактировать: Изменено воспроизведение для кодирования последовательности (или порядка).

1 ответ

Решение

С последней версией ffmpeg вы можете запустить,

ffmpeg -i input.mp4
  -vf "select='eq(pict_type\,I)" -vsync 0 -frame_pts 1 thumbnails-%02d-I.png
  -vf "select='eq(pict_type\,B)" -vsync 0 -frame_pts 1 thumbnails-%02d-B.png
  -vf "select='eq(pict_type\,P)" -vsync 0 -frame_pts 1 thumbnails-%02d-P.png

Серийные номера изображений будут соответствовать их позиции индекса (по отображению) в видео, а суффикс будет указывать тип кадра.


Чтобы получить кадры в порядке кодирования / декодирования, запустите

ffmpeg -i input.mp4
  -vf "setpts=POS,select='eq(pict_type\,I)" -vsync 0 -frame_pts 1 thumbnails-%09d-I.png
  -vf "setpts=POS,select='eq(pict_type\,B)" -vsync 0 -frame_pts 1 thumbnails-%09d-B.png
  -vf "setpts=POS,select='eq(pict_type\,P)" -vsync 0 -frame_pts 1 thumbnails-%09d-P.png

Вы должны отсортировать список выходных изображений в алфавитном / лексическом порядке - это изображения в порядке кодирования / декодирования. При желании вы можете пакетно переименовать 9-значное поле в простой последовательный индекс.

setpts=POS устанавливает временную метку кадра в его байтовое смещение в файле, который будет отслеживать порядок кодирования / декодирования.

Другие вопросы по тегам