Если я вас правильно понимаю, эта статья в вики FFmpeg под названием «Создание миниатюрного изображения каждые X секунд видео» показывает, что FFmpeg не может делать то, что вы хотите (без некоторых автоматических вычислений).
Вики говорит, что -vf "fps=fps=XYZ"
это ваш лучший снимок - он будет создавать один эскиз / кадр каждые XYZ
кадры оригинального видео. Если вам действительно нужно 10 изображений для каждого видео, и все они имеют разную длину, вы можете сначала прочитать общее количество кадров, а затем вычислить необходимый fps с помощью скрипта:
XYZ=wanted_frames_times_actual_fps/total_frames_of_vid
с wanted_frames_times_actual_fps
того, например, 10*25
(PAL) или 10*30
(NTSC) в вашем случае и total_frames_of_vid=(hh*3600+mm*60+ss)*25+ff
, где hh
означает часы, mm
означает минуты, ss
означает секунды, а ff
значит, кадры (после того, как последний подсчитывают второй). Пример вычисления: временный код 01:35:45:24
(или 01:35:45.960
в терминах FFmpeg, поскольку FFmpeg не использует кадры, а миллисекунды) со скоростью 25 кадров в секунду, всего напоминает 143649 кадров.
Это решение вполне может сработать - вам просто нужно найти способ получить общее время видео (например, через ffprobe) и его fps (если вы не можете получить правильный тайм-код), а затем сохранить эту информацию как переменную с именем $total_frames_of_vid
.
Я нашел другой подход к этому в разделе «Также видят» вики, ссылаясь на вопрос суперпользователя под названием «Значимые миниатюры для видео с использованием FFmpeg», который предлагает использовать:
ffmpeg -hide_banner -i <YOUR_VIDEO> -vf "select=gt(scene\,0.8)" -frames:v 10 -vsync vfr -vf "fps=fps=1/200" -y out%03d.png
(Я немного изменил код - изменил кодек изображения на PNG и изменил значения для -frames:v
и fps
. Также изменил выходные изображения, чтобы иметь три цифры в именах.)
а затем перекодировать их в свой GIF.
Это решение также требует некоторых вычислений или ручного труда, так как значения всех опций (и особенно fps
нуждаются в изменении в зависимости от длины видео. Т.е. я попробовал оригинальный код от суперпользователя с 35-минутным видео - и получил только 5 кадров из него ,