Использование 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
устанавливает временную метку кадра в его байтовое смещение в файле, который будет отслеживать порядок кодирования / декодирования.