FFMPEG: конвертировать видео в Animated Gif Preview, получая кадр через интервал

Я хотел бы сгенерировать gif-превью для своего приложения и сделать это на моем сервере с помощью FFMPEG.

Он должен генерировать gif, получая 10 кадров для каждого видео, но без использования временного каталога (или временных файлов, относящихся к каждому кадру), если это возможно.

Что касается этого ответа на usersuper.ru, он должен генерировать GIF, используя каждый кадр, это не мне нужно.

Кажется странным, но эффект мне нужно что-то вы можете увидеть на многих сайтах порно (я не помню, какой из них)

1 ответ

Решение

Если я вас правильно понимаю, эта статья в вики 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 кадров из него.

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